python - 多处理池示例(并行)比顺序处理慢。尝试理解Python中的池

标签 python performance multiprocessing

我一直在阅读并试图了解如何通过多处理更快地运行 python。我找到了这个例子:multiprocessing.Pool example

然后我做了这个测试并在 8 核的服务器上运行。

import time
from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    start_time = time.time()
    map(f, [x for x in range(1000000)])
    print("Sequential run time: %.2f seconds" % (time.time() - start_time))

    start_time = time.time()
    p = Pool(8)
    p.map(f, [x for x in range(1000000)])
    print("Parallel run time: %.2f seconds" % (time.time() - start_time))

但是,使用Pool时结果较慢

输出

Sequential run time: 0.13 seconds
Parallel run time: 0.98 seconds

我做错了什么? 谢谢

最佳答案

您没有做任何错误,除了也许运行的进程数量超过了您运行它们的物理核心数量 - 无法从这里猜测您是否至少有 8 个核心可用于运行您创建的 8 个进程。

但即使这样做,计算一个 f(x) 结果所花费的时间与将参数传递给工作进程以及将结果传回工作进程的所有开销相比也是微不足道的- f() 几乎没有做任何工作。 IPC(进程间通信)并不便宜。

这就是文档反复强调尽可能少进行 IPC 的原因。如果每个函数调用完成的有用工作很小,您将不会获得任何整体加速(相反,正如您所发现的)。

顺便说一句,这个:

[x for x in range(1000000)]

最好写成简单的:

range(1000000)

虽然做出这样的改变对这里的真实观点没有什么影响。

关于python - 多处理池示例(并行)比顺序处理慢。尝试理解Python中的池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38165552/

相关文章:

python - 在 Django 中使用 Pylint

java - ArrayList<JSONObject> 与 JSONArray

python - Windows 多处理

python - 在Python中生成部分子集

python - 嵌套字符串格式

python - 给定两个非零整数,如果恰好有一个为正数则打印 "YES"否则打印 "NO"(Python)

java - 为什么 Java CPU 配置文件(使用 visualvm)在一个什么都不做的方法上显示如此多的命中?

Java probablePrime 性能

multiprocessing - celery 是如何工作的?

python - 优化包含 8 个 for 循环的嵌套循环以最小化函数