1

3Dフィールド上の3ネストループを単純化する方法はありますか?コードは次のようになります。

from itertools import product
for kx, ky, kz in product(freq, freq, freq):
    k = np.sqrt(kx**2+ky**2+kz**2)
    if int(k+0.5) < N/2.0:
        yaxes[field][int(k+0.5)] += A[kx][ky][kz]

Aの形状は(N、N、N)であり、freqは長さNの特別な反復です。おそらく、このコードを実行するためのnumpy-toolがあるため、これを長くする必要があります。

4

1 に答える 1

0

この単純な最適化により、時間の消費を20%削減できます。

NN = N/2.0
for kx, ky, kz in product(freq, freq, freq):
    k = int(np.sqrt(kx**2 + ky**2 + kz**2) + 0.5)
    if k < NN:
        yaxes[field][k] += A[kx][ky][kz]

disモジュールを使用してバイトコードをチェックし、timeitを使用してアルゴリズムの速度を測定します。以下の例は、コードがどのように変更されたかを示しています。

int(k + 0.5)を書くたびに、次のバイトコードが得られます。

     65 LOAD_GLOBAL              3 (int) 
     68 LOAD_FAST                2 (k) 
     71 LOAD_CONST               3 (0.5) 
     74 BINARY_ADD           
     75 CALL_FUNCTION            1 

一度計算することをお勧めします。そうすれば、次の呼び出しがはるかに速くなります。

     75 LOAD_FAST                2 (k)

N/2.0についても同じ話です。すべての反復でこれを使用する代わりに:

     78 LOAD_GLOBAL              4 (N) 
     81 LOAD_CONST               4 (2.0) 
     84 BINARY_TRUE_DIVIDE   

事前に計算されたNNを使用できます。

     78 LOAD_GLOBAL              4 (NN)
于 2012-11-22T13:59:07.177 に答える