【问题标题】:Parallel programming in python (nested loop)python中的并行编程(嵌套循环)
【发布时间】:2016-04-26 18:20:32
【问题描述】:

我有以下代码,因为对于较大的 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

【问题讨论】:

  • 您需要提供更多背景信息。你的数据格式是什么?你能解释一下循环应该做什么吗?
  • 看看多处理库
  • 不会ws[x1:x1+1] 本质上意味着ws[x1] 和其他人类似吗?
  • 你不是说矢量化吗?
  • @Divakar:你是对的......我只是让它变得更复杂......

标签: python numpy parallel-processing


【解决方案1】:

我不完全理解您要计算的内容,但我会试一试。对于你的后一个问题,你可以这样做:

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 是同一件事)。从理论上讲,这应该与您的代码相同。

【讨论】:

  • 这看起来很不错,我会尽快尝试:)
  • Traceback(最近一次调用最后):文件“/2.3.1.py”,第 113 行,在 wp[:,0] = numpy.tensordot(numpy.tensordot(re, wp[:,0], axes=1), wp[:,0], axes=1) 文件“/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/numpy/ core/numeric.py",第 1246 行,在 tensordot if as_[axes_a[k]] != bs[axes_b[k]]: IndexError: tuple index out of range 我现在收到此错误。显然 re 张量现在有不同的大小?
  • 它的形状应该还是和以前一样,即(a**l,a**l,a**l)
  • 必须是 re[x] 吗?
  • 我在 a=2l=3r=0.3ws = np.ones(a**l) 的示例上进行了尝试。在那里它返回与您的代码相同的答案(即所有 re 条目都是 0.7)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 2021-09-24
相关资源
最近更新 更多