提问人:Ioannis Mourginakis 提问时间:8/31/2020 更新时间:8/31/2020 访问量:84
为什么 Pool.map() 比普通地图慢?
Why is Pool.map() slower than normal map?
问:
我正在尝试多处理。池功能,但我遇到了一个奇怪的问题,即使用 pool.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 秒(这似乎是不可能的,因为我为数组中的每个元素睡了整整 1 秒——至少需要 4 秒!我还尝试更改 Pool() 对象中的核心数。我在具有 4 个逻辑内核的双核 macbook pro 上运行。
答:
0赞
Ioannis Mourginakis
8/31/2020
#1
啊,发布一分钟后就想通了。
对于任何好奇的人,您需要在列表函数中调用 map 对象,如下所示:
sp = map(f, vector)
list(sp)
我认为这是因为python懒惰地评估了map对象。
评论
0赞
Abhilash
8/31/2020
没错。 Python 中的函数返回一个可迭代对象。map
评论