我有以下代码,因为它对于较大的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
答案 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是相同的东西)。理论上,这应该与您的代码相同。