【问题标题】:Help with how to pickle a ufunc?帮助如何腌制一个ufunc?
【发布时间】:2011-09-17 09:37:40
【问题描述】:

我正在尝试使用 MPI 将模块广播到其他 python 进程。当然,模块本身不是可腌制的,但 __dict__ 是可腌制的。目前,我正在挑选__dict__ 并在接收过程中制作一个新模块。这与一些简单的自定义模块完美配合。但是,当我尝试使用 NumPy 执行此操作时,有一件事情我不能轻易腌制:ufunc

我读过这个帖子,该帖子建议对ufunc__name____module__ 进行酸洗,但似乎他们依赖于在重建之前完全构建并呈现numpy。我需要避免在接收过程中一起使用import 语句,所以我很好奇提到的getattr(numpy,name) 语句是否适用于尚未包含ufuncs 的模块。

另外,我在 NumPy 文档中的 ufunc 上没有看到 __module__ 属性: http://docs.scipy.org/doc/numpy/reference/ufuncs.html

有什么帮助或建议吗?

编辑:对不起,忘记包括上面提到的线程。 http://mail.scipy.org/pipermail/numpy-discussion/2007-January/025778.html

【问题讨论】:

    标签: python numpy mpi pickle


    【解决方案1】:

    在 Python 中挑选一个函数只会序列化它的名称和它来自的模块。它不会通过网络传输代码,因此在取消酸洗时,您需要使用与酸洗时相同的库。在 unpickling 时,Python 只需导入有问题的模块,并通过 getattr 获取项目。 (这不仅限于 Numpy,也适用于一般的酸洗。)

    Ufuncs 不能干净地腌制,这是一个疣。然后,您的选择主要是仅腌制 ufunc 的 __name__(可能还有 __class__),然后稍后手动重建它们。 (它们实际上不是 Python 函数,并且没有 __module__ 属性。)

    【讨论】:

    • 接收进程实际上并没有导入任何东西,因为我只是通过 MPI (mpi4py) 中的bcast 函数腌制模块的__dict__。然后我制作了一个空白模块,将__dict__ 插入其中。我会用我的调试解释器运行它,看看它是否真的像你建议的那样导入任何东西。我正在尝试做的事情是尝试阻止接收进程在导入模块的同时访问文件系统。
    • 导入发生在 pickle.load 内部,mpi4py 调用它——这是你无法控制的。 (如果您有兴趣,可以查看酸洗是如何工作的:hg.python.org/cpython/file/tip/Lib/pickle.py#l1067 或只检查 hte pickle 流)如果您想绕过文件系统通过线路传递代码,这是可能的(但也许您应该单独提交一份此处的问题)- 要么将 Python 代码作为字符串传递,然后在另一侧使用 exec 编译它,要么将其编译为代码对象并将其传递过去。但是,你不能像这样复制 Numpy。
    猜你喜欢
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    相关资源
    最近更新 更多