【问题标题】:How to use parallel processing to run a for loop and some functions?如何使用并行处理来运行 for 循环和一些函数?
【发布时间】:2020-12-09 06:32:08
【问题描述】:

我有一个算法,它有几个 for 循环和一些有时需要按顺序运行或有时可以并行运行的函数。我在下面提供一个伪代码和一个示例。

这里,m 是一个数学模型,我正在尝试将变量添加到模型 mfor 循环彼此独立(我有几个这样的 for 循环而不是 2 个)。

for i in range(1,N+1):
    for d in range(1,delta+1):
        for t in range(1,T+1):
            for k in range(1,K+1):
                z[(i,d,t,k)] = m.addVar(vtype = GRB.BINARY, name="z%d,%d,%d,%d" % (i,d,t,k))

for k in range(1,K+1):
    for d in range(1,delta+1):
        Q[(k,d)] = m.addVar(vtype = GRB.BINARY, name="Q%d,%d" % (k,d))

一旦模型 m 完全构建,即所有 for 循环都完成,我就有了解决优化问题的命令。这只能在模型完全构建后才能完成。所以下一个命令是:

z,Q = Solve(m)

接下来,我使用其他 for 循环从模型 m 复制结果。这些不能直接使用,必须按照我使用的方式复制。

for i in range(1,N+1):
    for d in range(1,delta+1):
        for t in range(1,T+1):
            for k in range(1,K+1):
                z_value[(i,d,t,k)] = z[(i,d,t,k)].X

for k in range(1,K+1):
    for d in range(1,delta+1):
        Q_value[(i,inst)] = Q[(k,d)].X

这部分也是相互独立的。我有两个以上的循环要运行。

有没有一种方法可以对我的代码的这些部分使用并行处理。我该怎么做?

【问题讨论】:

标签: python parallel-processing multiprocessing python-multiprocessing


【解决方案1】:

您可以使用 itertools.product 将嵌套循环减少为一个循环,例如,您的第一个循环可以简化为以下示例,无需嵌套:

from itertools import product

for idtk in product(range(1,N+1), range(1,delta+1), range(1,T+1), range(1,K+1)):
    #idtk is a tuple the same as (i, d, t, k)
    z[idtk] = m.addVar(vtype = GRB.BINARY, name="z%d,%d,%d,%d" % idtk)

【讨论】:

  • 当然,但我不确定 intertools.product 是否一定比嵌套 for 循环更快。我不是专家,但这是我最初编写代码时发现的link
猜你喜欢
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
相关资源
最近更新 更多