2011-03-31 90 views
0

我正在用Python编程一个科学应用程序,目前为止我的算法的性能很糟糕。我试图找到一种有效的方式来编写我正在做的事情。基本上,我有相乘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变化和不能被缓存,因为它正在被这个类的外部产生的一个点。当然,这是非常缓慢,不是很明亮。我该如何改进?

谢谢!

回答

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和在我的代码改变的标志错误。

+0

谢谢。问题是chi不是一个向量,并且是为每个新的运行函数调用生成的。 – Ivan 2011-04-01 14:26:38

+0

@如果'chi'是一个浮点数,那么'y = np.power(chi,x)'其中'x'是一个数组将产生一个数组,其中y的第i个元素y_i = chi^x_i 。这是一个广播功能。我提供的代码应该与您最初编写的'get_thing'相当,但速度要快得多。 – JoshAdel 2011-04-01 14:34:03

1

简单地说,尝试在更高级别的抽象层次上进行计算,即尝试避免python级别的循环。

认真学习如何做逐元素的操作,以及如何broadcasting操作,并且最后但并非最不重要不要忘记linear algebra的力量!