python – 使用多处理的并行计算combination_with_replacement

我正在尝试将所有可能的组合与替换相结合,并使每个组合进行一些计算.我正在使用以下代码:

from itertools import combination_with_replacement

for seq in combination_with_replacement('ABCDE', 500):
    # some calculation

如何使用多处理并行化此计算?

最佳答案 您可以使用标准库
concurrent.futures.

from concurrent.futures import ProcessPoolExecutor
from itertools import combinations_with_replacement

def processing(combination):
    print(combination)
    # Compute interesting stuff


if __name__ == '__main__':
    executor = ProcessPoolExecutor(max_workers=8)
    result = executor.map(processing, combinations_with_replacement('ABCDE', 25))
    for r in result:
         # do stuff ...

更多解释:

>此代码使用进程创建执行程序.另一种可能性是使用线程,但是完整的python线程只能在一个核心上运行,所以它可能不是你需要运行大量计算的感兴趣的解决方案.
> map对象返回一个异步对象.因此,行executor.map ..是非阻塞的,您可以在for循环中收集结果之前进行其他计算.
>在if __name__ ==’__ main__’:块中声明处理函数并在此块中声明和使用执行程序非常重要.这可以防止无限执行程序生成并允许pickle worker函数将其传递给子进程.如果没有此块,代码可能会失败.

我建议使用multiprocessing.Pool,因为它有一个更聪明的方式来分派工作,因为你正在使用迭代器.

请注意,您可能无法计算500与5个元素ABCDE的组合.它需要计算5 ** 500> 1e350元素.通过并行化,您只能通过因子max_workers线性地减少计算,因此在这种情况下,每个进程需要运行〜1e349元素,如果每个计算在1微秒内完成,则需要大约1e335年.

点赞