0

我想并行化一些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为文字数字 orj不会产生错误,但这不是合适的解决方案,因为在实际代码i中将是一个循环变量。

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

4

1 回答 1

2

Python 3 在列表推导上创建了闭包。这段代码在 Python 2 上不会有问题。

IPython 不处理闭包。这将在 IPython 3.0(添加简单闭包支持)和 2.1(修复闭包检查)中修复(不同)。如果你告诉 IPython 使用dill,更多的东西将是可序列化的,包括这段特殊的代码:

rc[:].use_dill()

DirectView.use_dill是 IPython 2.0 中的新功能。

于 2014-04-30T21:52:47.557 回答