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