2015-11-08 69 views
1

我试图了解使用mapmultiprocessing。我为此写了下面的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分配给它。

+1

[multiprocessing.Pool()慢于仅使用普通函数的可能的重复](http://stackoverflow.com/questions/20727375/multiprocessing-pool-slower-than-just-using-ordinary-functions) – ppperry

回答

3

您的功能f太简单了,无法在这里受益。

multiprocessing的工作方式是分离整个Python程序的副本。如果您的系统有多个CPU,这些副本可以在单独的CPU上并行运行。你可以认为它们是一种主/从安排,原始的Python程序是CPU A的主设备,在这种情况下是一些从设备,从CPU B到F(它们不是有这种主/从关系,但我认为大多数人觉得更容易思考这种方式。)

然后,每当您的主人要求一些从属方计算,主包装参数值(使用pickle)并将它们发送给从站。 从机执行请求的计算,pickle作为答案,并将其发回给主机。

在你的情况下,参数是列表中的每个值(加上要调用的函数,参见脚注),结果是列表中值的平方。打包和解压缩值比计算时间要长得多,所以这是一个净损失。

如果您做了更多计算(与基本通信开销相比),您可能会看到净赢,但如果只有两个CPU,则创建大型池将会适得其反。


功能通话经由pickle也包裹起来。

+0

我已经将我的功能从“正方形”改变为“4的功率”,并且多处理变得比顺序处理更快。 – liv2hak