我正在试验多处理。池功能,但我遇到了一个奇怪的问题,使用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对象。