joblib.Parallel 是不是保持传递数据的原始顺序?
Posted
技术标签:
【中文标题】joblib.Parallel 是不是保持传递数据的原始顺序?【英文标题】:Does joblib.Parallel keep the original order of data passed?joblib.Parallel 是否保持传递数据的原始顺序? 【发布时间】:2019-11-01 16:46:47 【问题描述】:我想问同样的问题 Python 3: does Pool keep the original order of data passed to map? 用于工作库。例如:
Parallel(n_jobs=2)(delayed(sqrt)(i ** 2) for i in x)
语法有点暗示,但我总是担心并行处理的输出顺序,我不想根据未记录的行为编写代码。
【问题讨论】:
【参考方案1】:TL;DR - 它保留了两个后端的顺序。
扩展@Chris Farr 的答案,我实施了一个简单的测试。我让一个函数等待一些随机的时间(您可以检查这些等待时间是否不相同)。我知道每次都保留订单,两个后端都保留。
from joblib import Parallel, delayed
import numpy as np
import time
def f(wait):
time.sleep(wait)
return wait
n = 50
waits = np.random.uniform(low=0, high=1, size=n)
res = Parallel(n_jobs=8, backend='multiprocessing')(delayed(f)(wait) for wait in waits)
np.all(res == waits)
【讨论】:
【参考方案2】:Per the joblib documentation 您可以将backend
指定为multiprocessing
,它基于multiprocessing.Pool
。然后另一个答案将适用于结果实际上是有序的。
Parallel(n_jobs=2, backend="multiprocessing")(delayed(sqrt)(i ** 2) for i in x)
然而,默认情况下,他们使用loky,虽然不是很清楚,但可以通过实施测试来检测。
【讨论】:
以上是关于joblib.Parallel 是不是保持传递数据的原始顺序?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在使用 joblib.Parallel 时保护主循环很重要?
在 joblib `Parallel` 上下文中腌制 `matlab` 对象时出错
即使添加了“如果 __name__ == '__main__':”,Windows 上的 python joblib Parallel 也无法正常工作
Python 3:Pool 是不是保持传递给 map 的原始数据顺序?