我试图了解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
为什么顺序处理时间大于池处理时间?我在Linux(Ubuntu 14.04 VM)上运行此代码,它有两个CPU分配给它。
答案 0 :(得分:3)
您的功能f
太简单了,无法在此受益。
multiprocessing
的工作方式是分离整个Python程序的副本。如果您的系统有多个CPU,则这些副本可以在单独的CPU上并行运行。您可以将它们视为一种主/从排列,原始Python程序是CPU A上的主程序,以及一些从属程序-5,在这种情况下,在CPU B到F上。(它们不会< em> 拥有这种主/从关系,但我想大多数人都觉得这样思考更容易。)
然后,每当你的主机要求进行一些从机侧计算时,主机打包参数值(使用pickle
)并将它们发送给从机。 1 从机做请求的计算,pickle
是答案,并将其发回给主人。
在您的情况下,参数是列表中的每个值(加上要调用的函数,请参阅脚注),结果是列表中值的平方。打包和解包值所需的时间要比计算时间长得多,因此这是一个净损失。
如果你做了更多的计算(与基本的通信开销相比),你可能会看到净胜利,但如果只有两个CPU,那么大型池将会适得其反。
1 函数调用也通过pickle
进行了解析。