【问题标题】:Forcing modules to run in PyPy from a CPython script (run PyPy on part of the code)?强制模块从 CPython 脚本在 PyPy 中运行(在部分代码上运行 PyPy)?
【发布时间】:2013-04-08 11:44:56
【问题描述】:

有没有办法从 CPython 脚本导入模块,但在 PyPy 中运行它们?

问题是我有一个使用大量 SciPy(和 NumPy)的代码,但有部分代码可以使用 PyPy 进行优化。

这是我想做的一个随机示例:

sub_run_in_pypy.py 模块:

#assuming this can be optimized with PyPy
def function_a(foo):
    return foo**2

main_run_in_cpython.py 模块:

import scipy.stats as stats

#assuming this exists:
import import_function_for_pypy
pypy_imported_function = import_function_for_pypy(module_name=sub_run_in_pypy, function_name=function_a)

x = stats.t.rvs(5, loc=0, scale=1, size=1)

print pypy_imported_function(x)

如果这不存在,为什么不呢?

编辑:正如 Bakuriu 推断的那样,我的意思是它可能是在一个单独的进程中运行的东西。这会增加太多开销吗?

【问题讨论】:

  • 我不明白。您想以 CPython 的形式运行一些代码,以 PyPy 的形式运行一些代码吗?然后你必须使用两个不同的进程,一个使用 PyPy,一个使用 CPython,但这会增加很多进程间通信的开销。
  • 是的,这就是我的建议 - 开销真的会大大降低性能吗? (对不起,不清楚)
  • 视情况而定。多处理允许您添加一些并行计算,这可以提高多核机器上的计算速度,但您必须小心避免进程之间的许多小通信。避免发送小的“信息包”,尽量做批量通信。没有具体的代码,我们不能再说什么。您可能应该尝试profile(至少使用一些示例代码)。
  • 我明白了。因此,由于效率是特定于代码的,因此您认为这不是主流做法。不幸的是,由于代码太长且太复杂,我无法发布代码,但感谢您的提议。我会看看我能做什么。
  • 通常您必须考虑到进程之间的每次通信都比正常操作慢 1000 倍或更多倍。根据任务的不同,可能会或不可能将这些繁重的操作“稀释”在其他操作中以获得加速。其他任务本质上是串行的,无论如何,您不会通过并行化获得很大的加速。所以,是的,这在很大程度上取决于你的问题。有一些传统的方法可以做到这一点,例如管道、RPC、信号或套接字,所以你应该看看standard library

标签: python module cpython pypy


【解决方案1】:

由于我早在其他线程之前就偶然发现了这个问题,因此简要描述了反向机制here (Can I embed CPython inside PyPy?)

基本思想是在 CPython 解释器旁边启动一个 PyPy 解释器(反之亦然),并通过进程间通信连接它们。虽然您可能会尝试通过管道或套接字来执行此操作,但强烈建议使用更高级别的库,例如 execnet(实际上是 used for this purpose)。

如果您采用低级方法,请务必尽早决定是否以及如何处理多线程或多进程执行等架构,是否需要异步计算甚至主从设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    相关资源
    最近更新 更多