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
其中 idx
比 groups
大得多。
为了加快速度,我查看了 Python 中的 multiprocessing
和 joblib
。但是,我们应该在外循环上并行化(将 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个进程。困难在于确保每个工人的工作队列不会太长或太短
假设我们有一些像这样的操作:
groups = ['A','B','C']
idx = [n for n in range(1000)]
for group in groups:
for i in idx:
# Compute something
其中 idx
比 groups
大得多。
为了加快速度,我查看了 Python 中的 multiprocessing
和 joblib
。但是,我们应该在外循环上并行化(将 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个进程。困难在于确保每个工人的工作队列不会太长或太短