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 ベクトルの平均化を大量に実行する必要があり、非常に扱いにくくなります。

不思議なことに、ループごとにこの操作を 2 回 (Ex、Ey に対して 1 回、Ez に対して 1 回) 実行し、Ez に対して同じ操作を実行すると、ほぼ 2 倍の時間がかかります。

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