并行IPython检测列表理解中的闭包

时间:2014-04-30 11:59:51

标签: python ipython pickle ipython-parallel

我想将一些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}将是一个循环变量。

有没有办法让这个列表理解工作?

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中的新功能。