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

Why is Pool.map() slower than normal map?

提问人:Ioannis Mourginakis 提问时间:8/31/2020 更新时间:8/31/2020 访问量:84

问:

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

Python 多处理

评论


答:

0赞 Ioannis Mourginakis 8/31/2020 #1

啊,发布一分钟后就想通了。

对于任何好奇的人,您需要在列表函数中调用 map 对象,如下所示:

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

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

评论

0赞 Abhilash 8/31/2020
没错。 Python 中的函数返回一个可迭代对象。map