我有一个关于joblib的问题。我正在使用 networkX 图,并希望并行化边的修改,因为迭代边列表确实是一个令人尴尬的并行问题。在这样做时,我想到了运行代码的简化版本。
我有一个变量x
。它是一个列表列表,类似于边缘列表,尽管我知道 networkX 返回边缘列表的元组列表,并且主要具有基于字典的实现。请暂时忍受这个简单的例子。
x = [[0, 1, {'a': 1}],
[1, 3, {'a': 3}]]
我有两个函数可以将字典的'a'
值修改为前两个值的加法或前两个值的减法。它们是这样定义的:
def additive_a(edge):
edge[2]['a'] = edge[0] + edge[1]
def subtractive_a(edge):
edge[2]['a'] = edge[0] - edge[1]
如果我执行常规 for 循环,则x
可以正确修改变量:
for edge in x:
subtractive_a(edge) # or additive_a(edge) works as well.
结果:
[[0, 1, {'a': -1}], [1, 3, {'a': -2}]]
但是,当我尝试使用 joblib 执行此操作时,我无法获得所需的结果:
Parallel(n_jobs=8)(delayed(subtractive_a)(edge) for edge in x)
# I understand that n_jobs=8 for a two-item list is overkill.
期望的结果是:
[[0, 1, {'a': -1}], [1, 3, {'a': -2}]]
当我检查 x 时,它没有改变:
[[0, 1, {'a': 1}], [1, 3, {'a': 3}]]
我不确定这里发生了什么。我可以理解 joblib 文档中提供的示例——它专门展示了使用单个简单函数计算数字数组。但是,这并不涉及修改内存中的现有对象,这是我想我正在尝试做的。有针对这个的解决方法吗?我将如何修改此代码以并行修改内存中的单个对象?