跟踪 Joblib 中并行化 for 循环的索引
Keeping track of index of parallelized for loop in 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*]]
即使 joblib
不一定明确支持此功能,我发现了一种更好(更 Pythonic)的方法(二战对 this 问题的评论):将 list_of_objects
到这样的子列表列表,
new_list = [[i, value] for i, value in enumerate(list_of_objects)]
并将 new_list
提供给 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*]]
即使 joblib
不一定明确支持此功能,我发现了一种更好(更 Pythonic)的方法(二战对 this 问题的评论):将 list_of_objects
到这样的子列表列表,
new_list = [[i, value] for i, value in enumerate(list_of_objects)]
并将 new_list
提供给 joblib 函数,其中每个对象的索引将被显式附加。