4

我在一个 ipython notebook 中运行一个模拟,它由七个相互依赖的函数组成,需要 13 个不同的参数。一些函数在其他函数中被调用,以允许一个函数运行整个模拟。模拟涉及操作两个参数,总共 > 20k 次迭代。两个模拟可以异步运行。由于每次迭代大约需要 1.5 秒,我正在研究并行处理。

当我第一次尝试 ipyparallel 时,我得到了一个未定义的全局名称错误。找不到本地对象是有道理的。为了避免花费大量时间进入兔子洞,将一大堆对象传递给所有工人的最简单方法是什么?以这种方式使用 ipyparallel 时还有其他需要考虑的问题吗?

4

1 回答 1

8

这个相关问题有更多细节,但要点是:交互式定义的模块在交互式命名空间(__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,
))

如果您有多个名称要以这种方式推送,则可能是时候考虑在模块中定义这些函数,并改为分发它们。

于 2015-10-10T16:40:59.637 回答