joblib.Parallel 是否保持数据传递的原始顺序?

Does joblib.Parallel keep the original order of data passed?

我想问同样的问题 用于作业库。例如:

Parallel(n_jobs=2)(delayed(sqrt)(i ** 2) for i in x)

语法有点隐含,但我总是担心并行处理输出的顺序,我不想基于未记录的行为编写代码。

Per the joblib documentation 您可以将 backend 指定为基于 multiprocessing.Poolmultiprocessing。那么另一个答案将适用于结果实际上是有序的。

Parallel(n_jobs=2, backend="multiprocessing")(delayed(sqrt)(i ** 2) for i in x)

然而,默认情况下,他们使用 loky,目前还不清楚,但可以通过实施测试检测到。

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)