Python 多处理 : why are large chunksizes slower?

标签 python parallel-processing multiprocessing python-multiprocessing

我一直在使用 Python 的多处理模块分析一些代码('job' 函数只是数字的平方)。

data = range(100000000)
n=4
time1 = time.time()
processes = multiprocessing.Pool(processes=n)
results_list = processes.map(func=job, iterable=data, chunksize=10000)
processes.close()
time2 = time.time()
print(time2-time1)
print(results_list[0:10])

我发现奇怪的一件事是最佳 block 大小似乎约为 10k 个元素 - 这在我的计算机上花费了 16 秒。如果我将 block 大小增加到 100k 或 200k,那么它会减慢到 20 秒。

这种差异是否是由于较长列表的酸洗所需时间较长? 100 个元素的 block 大小需要 62 秒,我假设这是由于在不同进程之间来回传递 block 所需的额外时间。

最佳答案

关于最佳 block 大小:

  1. 拥有大量的小块可以让 4 个不同的工作人员更有效地分配负载,因此更小的 block 是可取的。
  2. 另一方面,每次必须处理新 block 时,与进程相关的上下文更改都会增加开销,因此需要较少的上下文更改量和较少的 block 。

由于这两个规则需要不同的方法,中间的一点就是要走的路,类似于供需图表。

关于Python 多处理 : why are large chunksizes slower?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40799172/

相关文章:

Python/Json :Expecting property name enclosed in double quotes

Python Django json 序列化

python - 并行: Import a python file from sibling folder

c++ - OpenMP - Easy Loop,但仍然是无限的?

python 多处理在几次迭代后挂起

python - 如何使用numpy连接?

python - 具有大文件系统支持的纯 Python 持久键和基于值的容器(类似哈希的接口(interface))?

parallel-processing - 并行程序构造 - 计算机体系结构

python - 使用 Flask 和 RotatingFileHandler 进行原子日志文件轮换

python - 多处理线程池未按预期终止