我一直在阅读并试图了解如何通过多处理更快地运行 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/