Python 多进程:为什么大块大小会更慢?

10

我一直在使用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])

我发现奇怪的一件事是,最优块大小似乎在10k个元素左右 - 这需要16秒钟在我的电脑上。如果我将块大小增加到100k或200k,则速度会减慢至20秒。

这种差异可能是由于对更长列表进行pickle所需的时间更长吗? 100个元素的块大小需要62秒,我认为这是由于需要在不同进程之间传递块所需的额外时间。


https://dev59.com/xVQJ5IYBdhLWcg3wfl6M#54032744 是这个主题的权威答案。 - fantabolous
1个回答

17

关于最佳块大小:

  1. 拥有大量小的块可以使四个不同的工作进程更有效地分配负载,因此更小的块是可取的。
  2. 另一方面,与进程相关的上下文更改每次必须处理新块时会增加开销,因此希望减少上下文更改的数量和块的数量。

由于这两条规则需要不同的方法,因此中间点是正确的选择,类似于供需图表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接