Python多进程starmap和apply_async哪个更快?

4
假设我有两种方法来完成同一个任务:
from multiprocessing import Pool
pool = Pool(4)

def func(*args):
    # do some slow operations
    return something

dates = ['2011-01-01', ' 2011-01-02', ... , '2017-01-01']
other_args = [1, 2, 3, 'c', 'test', 'pdf')]
# approach 1:
res = [pool.apply_async(func, [day] + other_args) for day in dates]
list_of_results = [x.get() for x in res]

# approach 2: create an iterable of iterables
args = [[day] + other_args for day in dates]
list_of_results = pool.starmap(func, args)

我知道apply_async会立即返回,但是如果func函数还没有运行完,x.get()可能仍然会阻塞主线程...这两种方法之间一定会有性能差异吗?


使用异步方法的整个目的是避免等待结果,因为它们将在以后使用。 - Imanol Luengo
1个回答

2
在底层,starmap 基本上做的就是你在第一种方法中所做的。它只是一个便利包装器。提供 map 函数家族以符合许多开发人员习惯的函数式编程范式。
它们提供了一些不错的功能,例如将可迭代对象拆分成块以最小化 IPC。性能优势可能来自于这种优化,但这取决于每个单独元素的计算成本。
我建议坚持使用更易读的方法,只有当性能是一个真正的问题时,才进行基准测试和评估结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接