Python: эффективная генерация вектора с разными значениями - PullRequest
0 голосов
/ 31 марта 2011

Я программирую научное приложение на Python, и производительность моего алгоритма до сих пор ужасна.Я пытаюсь найти эффективный способ кодирования того, что я делаю.По сути, мне нужно умножить

 def get_thing(self, chi, n):

    return np.sum(self.an[n][j] * pow(chi, -j) for j in xrange(1, self.j))

, где self.an[i][j] - это ранее сгенерированный массив.Тогда мне придется сделать это:

 pot = np.sum(self.coeffs[n] * self.get_thing(chi, n) for n in xrange(0, self.n))

, где chi изменяется и не может быть кэширован, так как это точка, которая генерируется вне этого класса.Конечно, это очень медленно и не очень ярко.Как я могу улучшить это?

Спасибо!

Ответы [ 2 ]

1 голос
/ 31 марта 2011

В пределах get_things вы, безусловно, можете упростить что-то вроде:

def get_thing(self, chi, n):

    return np.sum(self.an[n,1:self.j] * np.power(chi,-np.arange(1,self.j)))

Обратите внимание, что вы не хотите индексировать массивы с помощью нотации [i] [j];вместо этого используйте [i, j].

Возможно, вы сможете внести дальнейшие улучшения, используя вещание более высокого уровня, как предложено @eat.

Редактировать: Сделано несколько измененийк приведенному выше коду, чтобы попытаться заставить индексирование соответствовать OP и изменило ошибку знака в моем коде.

1 голос
/ 31 марта 2011

Просто попробуйте выполнить вычисления на более высоком уровне абстракции, т.е. попытайтесь избежать зацикливания на уровне Python.

Внимательно изучите, как выполнять поэлементные операции и как работает вещание , и не в последнюю очередь не забывайте о силе linear algebra!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...