python中的并行编程(嵌套循环)

时间:2016-04-26 18:20:32

标签: python numpy parallel-processing

我有以下代码,因为它对于较大的l来说非常慢,我问自己是否有可能并行化这个循环。我也试图通过自己的方式将它平行化,但因为在我无法管理它之前我从未这样做过。如果你能帮助我,我会很高兴

print('Create 2.0L%.3frec%.3f.npy' % (l, r))
for x1 in range(a**l):
    for x2 in range(a**l):
        for x3 in range(a**l):
            f11 = 0
            if numpy.ndarray.sum(numpy.absolute(numpy.subtract(ws[x1:x1+1], ws[x2:x2+1]))) == 0:
                f11 += 1
            if numpy.ndarray.sum(numpy.absolute(numpy.subtract(ws[x1:x1+1], ws[x3:x3+1]))) == 0:
                f11 += 1
            re[x1][x2][x3] = 1.0*r/(a**l-2)*(numpy.product(numpy.absolute(numpy.subtract((2*ws[x1:x1+1]+ws[x2:x2+1]+ws[x3:x3+1]), 2)))-f11)

            cv1 = numpy.ndarray.sum(numpy.absolute(numpy.subtract(ws[x1:x1+1], ws[x2:x2+1])))
            cv2 = numpy.ndarray.sum(numpy.absolute(numpy.subtract(ws[x1:x1+1], ws[x3:x3+1])))
            c2 = 0
            if cv1 == 0:
                c2 += 1
            if cv2 == 0:
                c2 += 1
            c2 *= 1.0*(1-r)/2
            re[x1][x2][x3] += c2
numpy.save('2.0L%.3frec%.3f' % (l, r), re)
print('Saved 2.0L%.3frec%.3f.npy' % (l, r))

因为re的所有条目都独立于其他条目,所以应该有一种方法。我想如果我知道一个如何拼凑python程序的解决方案,我会得到帮助,如:

for x1 in range(a):
    for x2 in range(a):
        for x3 in range(a):
            re[x1][x2][x3] = 5*3

1 个答案:

答案 0 :(得分:2)

我不完全明白你想要计算什么,但我会试一试。对于后一个问题,您可以按照以下方式执行此操作:

re = np.empty([a]*3) 
x = np.indices([a]*3)
re[x] = 5*3

您可以按如下方式对代码进行矢量化:

x = np.indices([a**l]*3)
cv1 = (ws[x[0]] == ws[x[1]]).astype(float)
cv2 = (ws[x[0]] == ws[x[2]]).astype(float)
f11 = cv1 + cv2
re = 1.0*r/(a**l-2)*(np.absolute(2*ws[x[0]]+ws[x[1]]+ws[x[2]]-2)-f11)    
re += f11*1.0*(1-r)/2 

(我删除了多余的总和和产品,并使用==运算符检查相等的值,并使用c2和f11是相同的东西)。理论上,这应该与您的代码相同。