顺序处理比池处理更快

sequential processing faster than pool processing

我试图理解 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。

您的函数 f 过于简单,无法在此处受益。

multiprocessing 的工作方式是分拆整个 Python 程序的副本。如果您的系统有多个 CPU,则这些副本可以 运行 在单独的 CPU 上并行。您可以将它们视为某种 master/slave 排列,原始 Python 程序是 CPU A 上的主程序,而一些从属程序(在本例中为 5 个)在 CPU 从 B 到 F。(他们 没有 有这种 master/slave 关系,但我认为大多数人发现这样更容易思考。 )

然后,每次你的master请求一些slave端的计算时,master将参数值打包(使用pickle)并发送给slave。1 从服务器执行请求的计算,pickle 给出答案,然后将其发送回主服务器。

在你的例子中,参数是列表中的每个值(加上要调用的函数,见脚注),结果是列表中值的平方。打包和解包值的时间比计算要长得多,因此这是净损失。

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


1要调用的函数也通过 pickle 结束。