在python中优化多个嵌套for循环

时间:2012-01-21 10:28:24

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

以下是测试代码,我的实际代码看起来几乎相似,其中我使用相当随机生成的原始矩阵。如何优化此嵌套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。 谢谢。

2 个答案:

答案 0 :(得分:2)

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

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

等等。

同样,对于实际代码,您需要将循环转换为矢量化操作。在不知道你的实际计算是什么的情况下,我无法说出如何做到这一点。

答案 1 :(得分:1)

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

我不知道你的实际代码是否可行,但在你发布的代码中,它应该是可能的。