【问题标题】:How to use IPython.parallel for functions with multiple inputs?如何将 IPython.parallel 用于具有多个输入的函数?
【发布时间】:2014-10-28 05:59:32
【问题描述】:

这是我第一次尝试使用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一无所知。

【问题讨论】:

    标签: python multiprocessing ipython ipython-parallel


    【解决方案1】:

    我找到了两种方法来完成这项工作:

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

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

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 2020-08-25
      • 1970-01-01
      相关资源
      最近更新 更多