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.Pool
的 multiprocessing
。那么另一个答案将适用于结果实际上是有序的。
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)
我想问同样的问题
Parallel(n_jobs=2)(delayed(sqrt)(i ** 2) for i in x)
语法有点隐含,但我总是担心并行处理输出的顺序,我不想基于未记录的行为编写代码。
Per the joblib documentation 您可以将 backend
指定为基于 multiprocessing.Pool
的 multiprocessing
。那么另一个答案将适用于结果实际上是有序的。
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)