IPython 中带多个参数的并行映射函数

2024-04-03

我正在尝试使用 IPython 的并行环境,到目前为止,它看起来很棒,但我遇到了问题。假设我有一个在库中定义的函数

def func(a,b):
   ...

当我想要评估 a 的一个值和 b 的一组值时,我会使用它。

[func(myA, b) for b in myLongList]

显然,真正的函数更复杂,但问题的本质是它需要多个参数,而我只想映射其中一个参数。问题是 map、@dview.parallel 等映射了所有参数。

假设我想得到 func(myA, myLongList) 的答案。最明显的方法是使用 functools.partial 进行柯里化,或者就像

dview.map_sync(lambda b: func(myA, b),   myLongList)

但是,这在远程计算机上无法正常工作。原因是,当 lambda 表达式被 pickle 时,不包括 myA 的值,而是使用远程计算机上本地范围内的 myA 值。当闭包被腌制时,它们关闭的变量却不会。

我能想到的两种实际可行的方法是手动为每个参数构建列表并对所有参数进行映射,

dview.map_sync(func, [myA]*len(myLongList), myLongList)   

或者可怕地使用数据作为函数的默认参数,迫使它被腌制:

# Can't use a lambda here b/c lambdas don't use default arguments :(
def parallelFunc(b, myA = myA):
    return func(myA, b)

dview.map_sync(parallelFunc, myLongList)

确实,当实际函数需要大量参数并且更加复杂时,这一切看起来都非常扭曲。有一些惯用的方法吗?就像是

@parallel(mapOver='b')
def  bigLongFn(a, b):
   ...

但据我所知,像“mapOver”这样的东西并不存在。我可能知道如何实现它......这感觉像是一个非常基本的操作,应该存在支持,所以我想检查我是否遗漏了一些东西。


我可以对巴图的答案进行一些改进(我认为这是一个很好的答案,但可能没有详细说明为什么使用这些选项)。 ipython 文档目前在这一点上也严重不足。所以你的函数的形式是:

def myfxn(a,b,c,d):
  ....
  return z

并存储在一个名为mylib。假设 b、c 和 d 在运行期间相同,因此您编写一个 lambda 函数将其简化为 1 参数函数。

import mylib
mylamfxn=lambda a:mylib.myfxn(a,b,c,d)

并且你想运行:

z=dview.map_sync(mylamfxn, iterable_of_a)

在梦想的世界里,一切都会像那样神奇地进行。但是,首先您会收到“未找到 mylib”的错误,因为 ipcluster 进程尚未加载 mylib。如有必要,请确保 ipcluster 进程的 python 路径中有“mylib”,并且位于 myfxn 的正确工作目录中。然后你需要添加到你的Python代码中:

dview.execute('import mylib')

它运行import mylib每个进程的命令。如果再试一次,您将收到类似“全局变量 b 未定义”的错误,因为虽然变量位于 Python 会话中,但它们并不位于 ipcluster 进程中。然而,python提供了一种将一组变量复制到子进程的方法。继续上面的例子:

mydict=dict(b=b, c=c, d=d)
dview.push(mydict)

现在所有子进程都可以访问 b、c 和 d。然后你可以运行:

z=dview.map_sync(mylamfxn, iterable_of_a)

现在它应该像广告中那样工作了。不管怎样,我是Python并行计算的新手,并且发现这个线程很有用,所以我想我应该尝试帮助解释一些让我有点困惑的点......

最终的代码是:

import mylib

#set up parallel processes, start ipcluster from command line prior!
from IPython.parallel import Client
rc=Client()
dview=rc[:]

#...do stuff to get iterable_of_a and b,c,d....

mylamfxn=lambda a:mylib.myfxn(a,b,c,d)

dview.execute('import mylib')
mydict=dict(b=b, c=c, d=d)
dview.push(mydict)
z=dview.map_sync(mylamfxn, iterable_of_a)

这可能是让几乎任何令人尴尬的并行代码在 python 中并行运行的最快、最简单的方法......

UPDATE您还可以使用 dview 不循环地推送所有数据,然后使用 lview (即lview=rc.load_balanced_view(); lview.map(...)以负载平衡的方式进行实际计算。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IPython 中带多个参数的并行映射函数 的相关文章

  • 默认情况下在 Jupyter 笔记本中配置第一个单元

    有没有办法为 Jupyter 笔记本中的特定 python 内核配置默认的第一个单元 我同意默认的 python 导入违背了良好的编码实践 那么 我可以配置笔记本 使新的 python 笔记本的第一个单元始终是 import numpy a
  • python的_random是什么?

    如果你打开random py看看它是如何工作的 它的类Random子类 random Random import random class Random random Random Random number generator base
  • Python 将列表中的字符串转换为数字

    我遇到了以下错误消息 以 10 为基数的 int 的文字无效 2 2 外部用单引号括起来 内部用双引号括起来 该数据位于primes列出使用print primes 0 样本数据在primes list 2 3 5 7 The primes
  • C# 并行与并行线程代码性能

    我一直在测试 System Threading Parallel 与线程的性能 我很惊讶地发现并行比线程花费更长的时间来完成任务 我确信这是由于我对并行的了解有限 我刚刚开始阅读 我想我会分享一些片段 如果有人可以向我指出并行代码比线程代码
  • 地图与星图的性能?

    我试图对两个序列进行纯Python 没有外部依赖 逐元素比较 我的第一个解决方案是 list map operator eq seq1 seq2 然后我发现starmap函数来自itertools 这看起来和我很相似 但事实证明 在最坏的情
  • Python 可以使用单独的媒体播放器打开 mp3 文件吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否可以开一个mp3Python 中的文件 可以使用Popen 我并不是要在程序中运行它 我的意思是作为媒体播放器中的一个单独窗口或其
  • parList 和 parBuffer 如何选择?

    我从 haskell 并行开始 我已经成功学习了如何使用一些策略 例如 r0 rseq rdeepseq parList parMap 现在我正在进一步寻求更高的效率 所以这是我的问题 有什么区别parList and parBuffer
  • int 对象在尝试对数字的数字求和时不可迭代? [复制]

    这个问题在这里已经有答案了 我有这个代码 inp int input Enter a number for i in inp n n i print n 但它抛出一个错误 int object is not iterable 我想通过将每个
  • 在 Windows 上将 NumPy 与 BLAS 链接

    我正在尝试在 Windows 系统上安装 Theano 并且需要安装 BLAS 和 LAPACK 我的 System32 文件夹中有这些的 dll 文件 当我运行 numpy config来自 Anaconda 的 show 库的路径正确显
  • 将数据框列打包到 pandas 中列出

    我需要将 pandas DataFrame 列打包到包含列表的一列中 例子 For gt gt gt df a b c 0 81 88 1 1 42 7 23 2 8 37 63 3 18 22 20 制作列表栏 list col 0 81
  • 如何在树莓派上更新到最新的 python 3.5.1 版本?

    我昨天拿到了 Raspberry Pi 我已经在尝试用它来编写代码了 我有一个计划在其上运行的程序 但它仅与 Python 版本 3 5 0 或 3 5 1 兼容 并且我在互联网上找到的所有内容似乎都已经过时 与 Python 2 有关 或
  • 收到的标签值 1 超出了 [0, 1) 的有效范围 - Python、Keras

    我正在使用具有张量流背景的 keras 开发一个简单的 cnn 分类器 def cnnKeras training data training labels test data test labels n dim print Initiat
  • 从 sublime_plugin.WindowCommand 获取当前文件名

    我开发插件sublime text 3 并想要获取当前打开的文件路径 absolute1 self window view file name 在哪里self is sublime plugin WindowCommand 但失败了 Att
  • Python 类方法的示例用例是什么?

    我读了Python 中的类方法有什么用 https stackoverflow com questions 38238 what are class methods in python for但那篇文章中的例子很复杂 我正在寻找 Pytho
  • 检测图像是否损坏或损坏

    我需要以编程方式检查用户在我的应用程序上选择作为壁纸的图像是否已损坏或损坏 基本上我为用户提供了选择自己的图像作为壁纸的选项 现在 当图像加载时 我只想检查它是否已损坏 如果您正在寻找 PHP 解决方案而不是 javascript 解决方案
  • 如何从python导入路径中删除当前目录

    我想使用 Mercurial 存储库hg本身 也就是说 我克隆了 Mercurialhttps www mercurial scm org repo hg https www mercurial scm org repo hg并想运行一些h
  • Networkx 中 Louvain 分区的可视化

    请帮助我更改 Louvain 聚类算法结果的可视化 我从网站上获取了代码https github com taynaud python louvain https github com taynaud python louvain我可以重写
  • 使用 Pandas 和 Group By 绘制堆叠直方图

    我正在使用如下所示的数据集 Gender Height Width Male 23 4 4 4 Female 45 4 4 5 我想可视化高度和宽度的堆叠直方图 我希望每个图有两个堆叠的直方图 每个性别一个 这是文档中的堆叠直方图 如果存在
  • 在 python 中使用递归替代 len()

    作为 CS1301 问题的一部分 我正在尝试使用递归编写一个函数 该函数将执行与 len 完全相同的操作 但是 我有两个问题 我正在使用全局变量 但我在课程中还没有学到这一点 cs1301 自动评分器告诉我 我的函数返回 26 而不是 13
  • PyQt QFileDialog exec_ 很慢

    我正在使用自定义QFileDialog因为我想选择多个目录 但是exec 功能非常慢 我不明白为什么 我正在使用最新版本的 PyQt 代码片段 from PyQt4 import QtGui QtCore QtNetwork uic cla

随机推荐