我在ipython笔记本中运行模拟,该笔记本由七个相互依赖的函数组成,需要13个不同的参数。在其他函数中调用某些函数以允许一个函数运行整个模拟。该模拟涉及操纵两个参数,总共> 20k次迭代。两个模拟可以异步运行。由于每次迭代需要大约1.5秒,我正在研究并行处理。
当我第一次尝试ipyparallel时,我得到了一个未定义的全局名称错误。从某种意义上讲,无法找到本地对象的工人。为了避免花费相当多的时间去挖掘兔子洞,将一大堆物品传递给所有工人的最简单方法是什么?以这种方式使用ipyparallel时还有其他需要考虑的问题吗?
答案 0 :(得分:8)
this related question中有更多详细信息,但要点是:交互式命名空间中的交互式定义模块解析(__main__
),这在发动机和客户端上是不同的。您可以使用view.push(dict(func=func, func2=func2))
将功能发送到引擎,在这种情况下可以找到它们。另一种方法是在您确保安装在所有引擎上的模块或包中定义您的功能。
例如,在脚本中:
def bar(x):
return x * x
def foo(y):
return bar(y)
view.apply(foo, 5) # NameError on bar
view.push(dict(bar=bar)) # send bar
view.apply(foo, 5) # 25
通常在笔记本或更大的脚本中使用IPython并行时,其中一个早期步骤就是引入引擎的命名空间:
rc[:].push(dict(
f1=f1,
f2=f2,
const=const,
))
如果你有多个名字推进这种方式,可能是时候考虑在模块中定义这些功能,然后分发它。