我试图理解map
与multiprocessing
的使用。为此,我编写了以下 python 程序。但结果似乎让我感到困惑。
from multiprocessing import Pool
import time
def f(x):
return x*x
if __name__ == '__main__':
p = Pool(5)
l = [x for x in range(2000000)]
start = time.clock()
p.map(f, l)
end = time.clock()
print('pool processing time {}'.format(end - start))
start = time.clock()
map(f, l)
end = time.clock()
print('sequential processing time {}'.format(end - start))
我得到的输出如下所示。
pool processing time 5.576627
sequential processing time 3.220387
为什么顺序处理时间大于池处理时间?我在分配有两个 CPU 的 Linux(Ubuntu 14.04 VM)上运行此代码。
最佳答案
您的函数 f
太简单,无法在这里受益。
多处理的工作方式是剥离整个 Python 程序的副本。如果您的系统有多个 CPU,则这些副本可以在单独的 CPU 上并行运行。您可以将它们视为某种主/从安排,原始 Python 程序是 CPU A 上的主程序,而一些从程序(在本例中为 5 个)位于 CPU B 到 F 上。(它们不 < em>必须有这种主从关系,但我认为大多数人发现这样思考更容易。)
然后,每当您的主设备请求一些从设备端计算时,主设备就会打包参数值(使用 pickle
)并将它们发送到从设备。1从机执行请求的计算,pickle
得到答案,并将其发送回主机。
在您的情况下,参数是列表中的每个值(加上要调用的函数,请参阅脚注),结果是列表中值的平方。打包和解包值所需的时间比计算所需的时间要长得多,因此这是净损失。
如果您进行更多计算(与基本通信开销相比),您可能会看到净胜,但如果只有两个 CPU,则创建一个大池会适得其反。
<小时/>1调用的函数也通过 pickle
进行封装。
关于python - 顺序处理比池处理更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33598448/