【问题标题】:Optimize multiple nested for loops in python优化python中的多个嵌套for循环
【发布时间】:2012-02-15 15:50:31
【问题描述】:

以下是测试代码,我的实际代码看起来几乎相似,其中我使用原始矩阵而不是随机生成。如何优化这个嵌套的 for 循环。我知道这在 python 中是可能的,但我无法这样做。

import time
import numpy as np

a = 1000
b = 500
sum2,sum3,sum4 = 0
t0 = time.time()

x = np.random.random(a*a).reshape([a,a])

for outer1 in xrange(0,a):
    for inner1 in xrange(0,b):
        for outer2 in xrange(0,a):
            for inner2 in xrange(0, a):
                sum2 += x[outer2][inner2]  #this is not the only operation I have   
        for outer3 in xrange(0,a):
            for inner3 in xrange(0, a):
                 sum3 += x[outer3][inner3] #this is not the only operation I have 
        for outer4 in xrange(0,a):
            for inner4 in xrange(0, a):
                sum4 += x[outer4][inner4] #this is not the only operation I have 

print time.time() - t0
print 'sum2: '+str(sum2)+' sum3: '+str(sum3)+' sum4: '+str(sum4)

我正在使用 python 2.7。 谢谢。

【问题讨论】:

  • 您所做的额外计算对优化代码的方式有很大影响。而且,也更有可能是任何瓶颈的原因,而不是这些总和。

标签: python performance optimization for-loop nested-loops


【解决方案1】:

对于 Numpy 数组,优化计算的方法是尽可能使用向量化操作。在您的示例中,由于看起来您正在对每个数组的元素求和,因此您应该保持数组一维并直接使用 sum 函数:

x = np.random.random(a*a)
sum2 = x.sum()

等等。

同样,对于您的实际代码,您需要将循环转换为矢量化操作。在不知道您的实际计算是什么的情况下,我无话可说。

【讨论】:

    【解决方案2】:

    正如您的代码所示,sum2 仅取决于值 outer2inner2,这是在两个变量为 outer1inner1 的循环中完成的。在您粘贴的代码中,您可以简单地省略 2 个外部循环(outer1inner1),而是将 sum2 的值乘以 a*b。这消除了两个循环并用应该更快的乘法替换它们。

    我不知道您的实际代码是否也可以这样做,但在您发布的代码中,应该可以。

    【讨论】:

      猜你喜欢
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多