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