我正在使用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
发生变化且无法缓存,因为它是在此类之外生成的一个点。当然,这是非常缓慢而且不是很明亮。我怎样才能改善这个?
谢谢!
答案 0 :(得分:1)
简单地说,尝试在更高级别的抽象中进行计算,即尽量避免使用python级别循环。
仔细研究如何进行元素操作以及broadcasting如何操作,最后但并非最不重要的是不要忘记linear algebra
的力量!
答案 1 :(得分:1)
在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]表示法索引numpy数组;而是使用[i,j]。
您可以使用更高级别的广播进行进一步改进,如@eat建议的那样。
修改强> 对上面的代码做了一些更改,试图让索引与OP匹配,并在我的代码中更改了一个符号错误。