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

2024-09-29 07:35:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于joblib的问题。我正在使用networkX图形,并希望并行化边的修改,因为迭代边列表确实是一个令人尴尬的并行问题。在这样做的时候,我想运行一个简化版本的代码。在

我有一个变量x。它是一个列表列表,类似于边缘列表,不过我知道networkX返回边缘列表的元组列表,并且主要是基于字典的实现。请暂时接受这个简单的例子。在

x = [[0, 1, {'a': 1}],
     [1, 3, {'a': 3}]]

我有两个函数将字典的'a'值修改为前两个值的加法或前两个值的减法。它们的定义如下:

^{pr2}$

如果我执行常规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文档中提供的示例,它特别说明了使用一个简单的函数计算一个数字数组。然而,这并不涉及修改内存中现有的对象,这是我想我正在尝试的。有解决办法吗?我如何修改这段代码来并行修改内存中的单个对象?在


Tags: 对象函数内存代码innetworkx图形列表