0

这是我第一次尝试使用IPython.parallel所以请多多包涵。

我读了这个问题 Parfor for Python 并且在实现一个简单的例子时遇到了麻烦,如下所示:

import gmpy2 as gm
import numpy as np
from IPython.parallel import Client

rc = Client()
lview = rc.load_balanced_view()
lview.block = True

a = 1
def L2(ii,jj):
    out = []
    out.append(gm.fac(ii+jj+a))
    return out 

Nloop = 100
ii = range(Nloop)
jj = range(Nloop)
R2 = lview.map(L2, zip(ii, jj))

我遇到的问题是:

  1. a是在循环之外定义的,我想我需要做一些像“推”这样的事情,但对此有点困惑。我需要“拉”后吗?
  2. 该函数需要两个参数,我不知道如何正确传递它们。我尝试了类似的东西,zip(ii,jj)但遇到了一些错误。
  3. 另外,我认为我使用随机库gmpy2不应该影响事情。它是否正确?我需要为此做一些特别的事情吗?

理想情况下,我希望得到您的帮助,因此在这个简单的示例中,代码运行时不会出错。

如果您认为将我的失败尝试发布在#2 上会有所帮助,请告诉我。我对#1一无所知。

4

1 回答 1

0

我找到了两种使这项工作有效的方法:

一个是push将变量添加到核心。没有必要拉它。该变量将简单地定义在每个流程引擎的命名空间中。

rc.client[:].push({'a':a})
R2 = lview.map(L2, ii, jj)

另一种方法是重新定义L2以作为输入并将'sa的数组传递给函数:amap

def L2(ii,jj,a):
    out = []
    out.append(gm.fac(ii+jj+a))
    return out
R2 = lview.map(L2, ii, jj, [a]*Nloop)

关于根据本网站的导入:http: //ipython.org/ipython-doc/dev/parallel/parallel_multiengine.html#non-blocking-execution 您只需在函数中导入所需的库:

注意函数内部的导入。这是一个通用模型,以确保在运行任务的地方导入适当的模块。您还可以通过 view.execute('import numpy')() 手动将模块导入引擎命名空间。

或者你可以按照这个链接 http://ipython.org/ipython-doc/dev/parallel/parallel_multiengine.html#remote-imports

于 2014-10-29T01:30:56.890 回答