Python 多处理并行化内循环或外循环

Python Multiprocessing Parallelize Inner or Outer Loop

假设我们有一些像这样的操作:

groups = ['A','B','C']
idx = [n for n in range(1000)]
for group in groups:
    for i in idx:
        # Compute something

其中 idxgroups 大得多。

为了加快速度,我查看了 Python 中的 multiprocessingjoblib。但是,我们应该在外循环上并行化(将 for group in groups 逻辑拆分为并行),还是在内部循环上并行化(将 for i in idx 逻辑拆分为并行)?

这在很大程度上取决于组的数量、核心的数量、实际计算的重量以及我可能忘记的其他几个因素。您可以通过创建一个迭代器来避免考虑这一点,该迭代器生成出现在内部循环中的 (group, i) 的所有元组,即将两个循环合并为一个。这可以通过 itertools' (cross) product:

来完成

粗略示例:

from itertools import product
from multiprocessing import Pool
with Pool() as p:
    p.map(compute_something, product(groups, idx)))

这在大多数情况下应该都能正常工作。

主要确定什么将绑定任务

少数同时进行的计算任务可以固定 cpu

另一方面,一个cpu几乎可以在互联网上闲置10,000个进程。困难在于确保每个工人的工作队列不会太长或太短