我有一个目前运行速度很慢的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很新。
答案 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也可以用很少的额外努力来显着加快这些任务,