Python 多处理:为什么大块的速度较慢?
Python multiprocessing: why are large chunksizes slower?
我一直在使用 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 秒。
这种差异是否是由于较长列表的酸洗所需时间较长? 100 个元素的块大小需要 62 秒,我假设这是由于在不同进程之间来回传递块所需的额外时间。
关于最佳块大小:
- 拥有大量的小块将允许 4 个不同的工作人员更有效地分配负载,因此更小的块将是可取的。
- 另一方面,每次必须处理新块时,与进程相关的上下文更改都会增加开销,因此需要较少的上下文更改量和较少的块。
由于这两个规则需要不同的方法,中间的一点就是要走的路,类似于供需图表。
我一直在使用 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 秒。
这种差异是否是由于较长列表的酸洗所需时间较长? 100 个元素的块大小需要 62 秒,我假设这是由于在不同进程之间来回传递块所需的额外时间。
关于最佳块大小:
- 拥有大量的小块将允许 4 个不同的工作人员更有效地分配负载,因此更小的块将是可取的。
- 另一方面,每次必须处理新块时,与进程相关的上下文更改都会增加开销,因此需要较少的上下文更改量和较少的块。
由于这两个规则需要不同的方法,中间的一点就是要走的路,类似于供需图表。