为什么Pool.map()比普通贴图慢



我正在试验多处理。池功能,但我遇到了一个奇怪的问题,使用Pool.map比只使用普通的map函数慢得多。

我已经在SO上找到了以前的答案。我发现的任何线索都会产生更多的问题。

这是我的代码:

import multiprocessing
from multiprocessing import Pool
import random
import time

def f(x):
time.sleep(1)
return x**3

if __name__ == '__main__':
vector = [1, 2, 3, 4] 
# Single Process
start = time.time()
sp = map(f, vector)
print(f"Single Process time: {time.time() - start}s")
print(f"Should equal ~4.00 s")
print("")
# Multiprocessing
p = Pool(processes=4)
start = time.time()
with p:
mp = p.map(f, vector)
print(f"Multi-Process time: {time.time() - start}s")
print(f"Should equal ~1.00 s")

这是我得到的打印输出:

Single Process time: 7.152557373046875e-07s
Should equal ~4.00 s
Multi-Process time: 1.1352498531341553s
Should equal ~1.00 s

我最初在这里做了一些与此线程非常相似的事情:为什么pool.map比法线贴图慢?我遇到了与最初海报相同的问题。因此,我尝试将循环缩短为四个,并添加一个time.sleep((函数来检查执行情况。这不起作用。

使用imap似乎可以大大缩短多处理代码,但我的单核解决方案仍然只需要不到1秒的时间(这似乎是不可能的,因为我对数组中的每个元素都睡了整整一秒——这应该至少需要4秒钟!(。我还尝试过更改Pool((对象中的核心数。我在一台双核macbook pro上运行,它有4个逻辑内核。

啊,刚发布一分钟就发现了。

对于任何好奇的人来说,你需要在列表函数中调用map对象,比如:

sp = map(f, vector)
list(sp)

我认为这是因为python懒惰地评估map对象。

最新更新