Joblib - 如何并行化修改内存中的变量

时间:2014-10-02 13:35:23

标签: python joblib

我对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文档中提供的示例 - 它专门展示了使用单个简单函数计算数字数组。但是,这并不涉及修改内存中的现有对象,这是我认为我正在尝试做的事情。这个问题有方法解决吗?如何修改此代码以并行化内存中单个对象的修改?

0 个答案:

没有答案