python多处理starmap vs apply_async,哪个更快?

时间:2017-06-21 16:32:22

标签: python pandas multiprocessing

假设我有两种方法来完成相同的任务:

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()可能仍会阻塞主线程......这两种方法之间是否存在性能差异?

1 个答案:

答案 0 :(得分:1)

在幕后,starmap几乎完成了您在第一种方法中所做的工作。它只是一个方便的包装。提供map系列函数是为了符合许多开发人员习惯的函数式编程范例。

它们提供了一些很好的功能,例如以块的形式分割迭代以最小化IPC。性能优势可能来自此优化,但这取决于每个元素的计算成本。

我建议坚持使用更具可读性的内容,并且只有在性能是真正关注时才能进行基准测试并评估结果。