并行IPython在列表理解中检测闭包
我想用并行IPython在列表理解中检测闭包,python,ipython,pickle,ipython-parallel,Python,Ipython,Pickle,Ipython Parallel,我想用IPython.parallel来并行一些python代码,但问题是,IPython在执行并行函数时检测闭包 My environment get的初始化方式为: from IPython.parallel import Client c = Client() v = c.direct_view() qs = [1,2,3,4] 该功能定义为: @v.parallel(block=True) def pbands(qs): i = 1 # This should normall
IPython.parallel来并行一些python代码,但问题是,IPython在执行并行函数时检测闭包
My environment get的初始化方式为:
from IPython.parallel import Client
c = Client()
v = c.direct_view()
qs = [1,2,3,4]
该功能定义为:
@v.parallel(block=True)
def pbands(qs):
i = 1 # This should normally be a loop variable inside the function
valar = [i for j in range(3)]
return 0
按如下方式执行此函数:
pbands(qs)
产生错误
ValueError: Sorry, cannot pickle code objects with closures
将列表中的i
替换为文字数字或j
,不会产生错误,但这不是合适的解决方案,因为在实际代码中i
将是一个循环变量
有什么方法可以让列表理解工作吗?Python 3在列表理解上创建闭包。这段代码在Python2上不会有问题
IPython不处理闭包。这将在IPython 3.0()和2.1()中修复(不同)。如果您告诉IPython使用dilldill
,更多的内容将可序列化,包括这段特定的代码:
rc[:].use_dill()
DirectView.use_dill
在IPython 2.0中是一个新功能。我用dill 0.2b1
尝试了您的解决方案,但这会导致一些不同的错误(KeyErrors
和UnpicklingError:pickle在帧结束之前用完了
)。这是dill
的旧版本,可能用dill-0.2
版本再试一次。