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 回答