0

我有一个 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 矩阵,而 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 很陌生。

4

1 回答 1

0

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

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

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

于 2014-02-04T00:08:13.273 回答