我想将一些python代码与IPython.parallel
并行化,并且遇到问题,即IPython在执行并行函数时会检测到闭包。
我的环境初始化为:
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
,不会产生错误,但这不是合适的解决方案,因为在实际代码中{{1}将是一个循环变量。
有没有办法让这个列表理解工作?
答案 0 :(得分:2)
Python 3在列表推导上创建闭包。这段代码不会成为Python 2的问题。
IPython不会处理闭包。这将在IPython 3.0(adding simple closure support)和2.1(fixing the closure check)中修复(以不同方式)。如果你告诉IPython使用dill
,那么可以序列化很多东西,包括这段特殊的代码:
rc[:].use_dill()
DirectView.use_dill
是IPython 2.0中的新功能。