我想并行化计算,同时在循环内重新定义要评估的函数。在我的Mac上,出现意外行为,即该函数未动态重新定义。
例如,我在Mac上运行以下代码
from joblib import Parallel, delayed
for i in range(2):
def the_function(x):
return i*x
result = Parallel(n_jobs=2, verbose=0)(delayed(the_function)(x) for x in range(3))
print(result)
并获得错误的输出
[0, 0, 0]
[0, 0, 0]
如果我在Dell Ubuntu计算机上运行相同的代码,或者设置了n_jobs=1
,则可以得到预期的输出结果
[0, 0, 0]
[0, 1, 2]
我的理解是(在我的Mac上)joblib试图通过一劳永逸地定义the_function
来帮助我,而我希望joblib为循环的每次迭代重新定义the_function
。有没有一种简单的方法可以告诉Joblib像我想要的那样工作,也许可以通过清除一些内存来实现?
编辑:一种解决方法是设置backend = 'multiprocessing'
而不是loky
。不幸的是,这带来了相当大的效率损失(我的代码花费了两倍的时间),所以我想知道是否存在基于使用loky
的变通方法。毕竟它可以在我的Ubuntu计算机上工作!