【问题标题】:Keeping track of index of parallelized for loop in Joblib在 Joblib 中跟踪并行化 for 循环的索引
【发布时间】:2019-12-07 03:50:22
【问题描述】:

在 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*]] 

【问题讨论】:

    标签: python loops parallel-processing joblib


    【解决方案1】:

    即使joblib 不一定明确支持此功能,我还是找到了一种更好(更 Pythonic)的方法(二战对this 问题的评论):将list_of_objects 转换为子列表像这样的列表,

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

    并将 new_list 输入到 joblib 函数中,其中每个对象的索引都将被显式附加。

    【讨论】:

    • 我们如何迭代all_output。它说 - “无”类型的对象不能用作可迭代值。
    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 2016-09-29
    • 1970-01-01
    • 2015-07-11
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    相关资源
    最近更新 更多