以下是测试代码,我的实际代码看起来几乎相似,其中我使用相当随机生成的原始矩阵。如何优化此嵌套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。 谢谢。
答案 0 :(得分:2)
使用Numpy数组,优化计算的方法是尽可能使用矢量化操作。在您的示例中,由于您看起来正在对每个数组的元素求和,因此您应该将数组保持为1维,并直接使用sum
函数:
x = np.random.random(a*a)
sum2 = x.sum()
等等。
同样,对于实际代码,您需要将循环转换为矢量化操作。在不知道你的实际计算是什么的情况下,我无法说出如何做到这一点。
答案 1 :(得分:1)
正如您的代码所示,sum2
仅取决于值outer2
和inner2
,这是在两个变量为outer1
和{{1}的循环中完成的}。在您粘贴的代码中,您可以简单地省略2个外部循环(inner1
和outer1
),而是将inner1
的值乘以sum2
。这消除了两个循环并用乘法替换它们,这应该更快。
我不知道你的实际代码是否可行,但在你发布的代码中,它应该是可能的。