python:嵌套循环在3d

时间:2012-11-22 12:57:03

标签: python performance loops nested iteration

有没有办法在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工具来执行这个代码,因为这需要很长时间。

1 个答案:

答案 0 :(得分: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模块检查字节代码和时间以测量算法的速度。下面有关代码如何更改的示例。

每次编写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)