加速numpy.dot里面的列表理解

时间:2014-02-03 23:10:05

标签: python performance numpy list-comprehension dot-product

我有一个目前运行速度很慢的numpy脚本。 花费绝大多数时间在循环中执行以下操作:

terms=zip(Coeff_3,Coeff_2,Curl_x,Curl_y,Curl_z,Ex,Ey,Ez_av)
res=[np.dot(C2,array([C_x,C_y,C_z]))+np.dot(C3,array([ex,ey,ez])) for (C3,C2,C_x,C_y,C_z,ex,ey,ez) in terms]
res=array(res) 

Ex[1:Nx-1]=res[1:Nx-1,0]
Ey[1:Nx-1]=res[1:Nx-1,1]

列表理解确实减慢了这段代码的速度。 在这种情况下,Coeff_3和Coeff_2是长度为1000的列表,其元素是3x3个numpy matricies,Ex,Ey,Ez,Curl_x等都是长度为1000的numpy数组。 我意识到如果我做了设置单个3x1000 E矢量的事情可能会更快,但我必须在步骤之间执行大量不同E矢量的平均,这会使事情变得非常笨拙。

然而,奇怪的是,我每次循环执行此操作两次(一次用于Ex,Ey,一次用于Ez),并且对Ez执行相同的操作几乎需要两倍的时间:

terms2=zip(Coeff_3,Coeff_2,Curl_x,Curl_y,Curl_z,Ex_av,Ey_av,Ez)
res2=array([np.dot(C2,array([C_x,C_y,C_z]))+np.dot(C3,array([ex,ey,ez])) for (C3,C2,C_x,C_y,C_z,ex,ey,ez) in terms2])

任何人都知道发生了什么事吗?请原谅我,如果它是明显的,我对python很新。

1 个答案:

答案 0 :(得分:0)

正如之前的评论所指出的,使用数组操作。 np.hstack()np.vstack()np.outer()np.inner()在这里很有用。您的代码可能会变成这样(不确定您的尺寸):

 Cxyz = np.vstack((Curl_x,Curl_y,Curl_z))
 C2xyz = np.dot(C2, Cxyz)
 ...

检查结果尺寸的形状,确保正确翻译问题。有时numexpr也可以用很少的额外努力来显着加快这些任务,