跟踪Joblib中的并行for循环索引

时间:2019-07-29 19:08:05

标签: python loops parallel-processing joblib

在Python中,我有一个对象列表,需要在其上循环进行迭代,并为每次迭代输出结果,同时还跟踪要迭代的对象的索引

通常,这不是问题,因为我可以使用enumerate来完成

results = []

for index, value in enumerate(list_of_objects):
    ... *calculations* ...

    results.append([index, result_of_calculations])

但是,最近我的计算花费了太多时间,因此我开始使用joblib来并行化我的循环。但是,现在我无法跟踪enumerate的操作索引,因为循环的每个部分都可以在不规则的时间开始和结束,并且我很困惑。

我如何才能像下面的代码那样工作,其中子数组的每个第一个值都引用用于该特定迭代的对象的索引?

from joblib import Parallel, delayed

def single_loop_function(x):
    single_output = *some calculations based on x*
    return single_output

all_output = Parallel(n_jobs=-1, verbose=3, backend="loky")(
    map(delayed(single_loop_function), list_of_objects))

print(all_output)
[[0, *result*], [1, *result*], ... [5, *result*], [3, *result*]] 

1 个答案:

答案 0 :(得分:0)

即使joblib不一定明确支持此功能,我还是发现了一种更好的方法(更Python化)(wwii对this问题的评论):转换list_of_objects到这样的子列表列表,

new_list = [[i, value] for i, value in enumerate(list_of_objects)]

然后将new_list馈入joblib函数,该函数将显式附加每个对象的索引。