顺序处理比池处理更快

时间:2015-11-08 20:06:35

标签: python dictionary python-multiprocessing

我试图了解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 个答案:

答案 0 :(得分:3)

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

multiprocessing的工作方式是分离整个Python程序的副本。如果您的系统有多个CPU,则这些副本可以在单独的CPU上并行运行。您可以将它们视为一种主/从排列,原始Python程序是CPU A上的主程序,以及一些从属程序-5,在这种情况下,在CPU B到F上。(它们不会< em> 拥有这种主/从关系,但我想大多数人都觉得这样思考更容易。)

然后,每当你的主机要求进行一些从机侧计算时,主机打包参数值(使用pickle)并将它们发送给从机。 1 从机做请求的计算,pickle是答案,并将其发回给主人。

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

如果你做了更多的计算(与基本的通信开销相比),你可能会看到净胜利,但如果只有两个CPU,那么大型池将会适得其反。

1 函数调用也通过pickle进行了解析。