【问题标题】:python: nested loop over 3dpython:3d上的嵌套循环
【发布时间】:2012-11-22 12:57:03
【问题描述】:

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

【问题讨论】:

    标签: python performance loops nested iteration


    【解决方案1】:

    通过这个简单的优化,您可以将时间消耗减少 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-21
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 2017-06-05
      • 1970-01-01
      相关资源
      最近更新 更多