python - 顺序处理比池处理更快

标签 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

为什么顺序处理时间大于池处理时间?我在分配有两个 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/

相关文章:

Python timeit问题

python - 如何以漂亮的方式显示包含词典的列表?

python - Tensorflow (Keras) 和多处理导致 GPU 内存不足

python - 具有多个纹理的 OpenGL 帧缓冲区

python - 如何找出 uWSGI 杀死 worker 的原因?

python - 为什么 pythonistas 调用当前引用 "self"而不是 "this"?

dictionary - Xquery 中的字典

java - 空指针异常 - 迭代 FastMap 值

Python:如何定义可由多处理池从命令行参数访问的全局变量?

python - 线程和多处理组合 [Python]