【问题标题】:Parallelize for loop in python在python中并行化for循环
【发布时间】:2017-03-17 02:00:31
【问题描述】:

我有一个想要加速的遗传算法。我认为实现这一目标的最简单方法是通过 pythons 多处理模块。在我的 GA 上运行 cProfile 后,我发现大部分计算时间都发生在评估函数中。

def evaluation():
    scores = []
    for chromosome in population:
        scores.append(costly_function(chromosome))

我将如何并行化此方法?重要的是,所有分数的附加顺序与程序按顺序运行时的顺序相同。

我正在使用 python 2.7

【问题讨论】:

  • 使用multiprocessing.Pool.map。结果将按照您发布的代码中的顺序进行排序。

标签: python-2.7 multiprocessing genetic-algorithm python-multiprocessing


【解决方案1】:

使用池(我同时显示 imap 和地图,因为谷歌上的一些结果说地图可能不适合订购,尽管我还没有看到证据):

from multiprocessing import Pool
def evaluation(population):
    return list(Pool(processes=nprocs).imap(costly_function,population))

或(我使用的):

 return Pool(processes=nprocs).map(costly_function,population)

将 nprocs 定义为所需的并行进程数。

来自: https://docs.python.org/dev/library/multiprocessing.html#multiprocessing.pool.Pool

【讨论】:

  • 我不认为这样的分数会以与​​程序顺序运行时相同的顺序附加
  • 我建议你尝试一下而不是猜测,它会(如果你不相信一开始就使用一个简短的列表)。注意我编辑了一个语法错误。
  • 我确认Pool.map 保持原来的顺序。我创建了一个函数,它需要一个索引,随机休眠一段时间,然后返回索引。无论进程数量还是块大小Pool.map 都维持了数百个项目的订单。这是有道理的,因为Pool.map 是根据内置的map() 函数建模的。
  • 我也确认了,虽然结果有条不紊,但评价却没有条理。这意味着Pool.map 会在内部跟踪原始订单,而维持订单的不仅仅是运气好或空闲进程阻塞。
  • @kabanus 我有一个稍微相关的问题:我想在一个 for 循环中并行化对同一个函数的两个调用,每个函数都有不同的参数,但我不知道如何在实践中做到这一点。请您看看我的问题here,看看您是否可以提供解决方案?
猜你喜欢
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
相关资源
最近更新 更多