【发布时间】: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