iPython平行推送每一个物体都是杂乱无章的

iPython平行推送每一个物体都是杂乱无章的,python,parallel-processing,ipython,ipython-parallel,Python,Parallel Processing,Ipython,Ipython Parallel,我喜欢iPython笔记本,但在使用ipyparallel的并行处理中,使用dview将每个本地对象推入引擎。push(dict(…)似乎不是有效的方法。你有什么有效的替代方法吗 我通常喜欢: from IPython import parallel rc = parallel.Client() dview = rc[:] dview.push(dict(x1=x1, x2=x2, ...., x100=x100)) # => I'd like to avoid this!! res =

我喜欢iPython笔记本,但在使用ipyparallel的并行处理中,使用
dview将每个本地对象推入引擎。push(dict(…)
似乎不是有效的方法。你有什么有效的替代方法吗

我通常喜欢:

from IPython import parallel

rc = parallel.Client()
dview = rc[:]
dview.push(dict(x1=x1, x2=x2, ...., x100=x100)) # => I'd like to avoid this!!
res = dview.map_async(run_once, range(5))
map_result = res.get()
rc.close()

默认情况下,IPython Parallel在发送函数之前不会解析闭包。这意味着,当您向引擎发送
run_once
时,
run_once
的主体查找
x1
,它将在引擎上查找
x1
,而不是在您的客户机上携带
x1
的副本。这可能很有用,因为它允许您通过更改每个引擎上的
x1
含义来执行操作。例如,此代码段依赖于
rank
在每个引擎上具有不同的值才能正常工作:

dview.scatter('rank', rc.ids, flatten=True)

def mul_by_rank(x):
    return x * rank

dview.map_sync(mul_by_rank, range(len(rc)))
如果您确实希望在发送函数时解析闭包(即隐式发送x1、x2和run_一次),则可以使用其他实现此功能的序列化库。其中一个版本是
cloudpickle
,您可以使用
dview启用它。请使用\u cloudpickle()
(您必须先安装cloudpickle)。如果执行此操作,则
run\u once
所依赖的局部变量应与
run\u once
一起发送:

dview.use_cloudpickle()
dview.map_sync(run_once, range(5))

默认情况下,IPython Parallel在发送函数之前不会解析闭包。这意味着,当您向引擎发送
run_once
时,
run_once
的主体查找
x1
,它将在引擎上查找
x1
,而不是在您的客户机上携带
x1
的副本。这可能很有用,因为它允许您通过更改每个引擎上的
x1
含义来执行操作。例如,此代码段依赖于
rank
在每个引擎上具有不同的值才能正常工作:

dview.scatter('rank', rc.ids, flatten=True)

def mul_by_rank(x):
    return x * rank

dview.map_sync(mul_by_rank, range(len(rc)))
如果您确实希望在发送函数时解析闭包(即隐式发送x1、x2和run_一次),则可以使用其他实现此功能的序列化库。其中一个版本是
cloudpickle
,您可以使用
dview启用它。请使用\u cloudpickle()
(您必须先安装cloudpickle)。如果执行此操作,则
run\u once
所依赖的局部变量应与
run\u once
一起发送:

dview.use_cloudpickle()
dview.map_sync(run_once, range(5))

谢谢我真的很想知道
cloud\u pickle
!谢谢我真的很想知道
cloud\u pickle