跳至主要内容

PyPy - 特性

PyPy 是 CPython 的替代品。它使用与之共同开发的 RPython 语言构建。使用它而不是 CPython 的主要原因是速度:它通常运行得更快(参见下一节)。

PyPy 实现 Python 2.7.18、3.10.14 和 3.9.19。它支持所有核心语言。它支持大多数常用的 Python 标准库模块。有关与 CPython 的已知差异,请参见我们的 兼容性 页面。

以下 CPU 架构受支持并得到维护

PyPy 的 x86 版本运行在多个操作系统上,例如 Linux(32/64 位)、MacOS(64 位)、Windows(32 位)、OpenBSD、FreeBSD。非 x86 版本在 Linux 上受支持,ARM64 在 MacOS 上受支持。

如果您有兴趣提供帮助,请参见我们的 howtohelp 页面。

PyPy 的主要特性:

速度

我们的 主要可执行文件 带有一个即时编译器。它在运行大多数基准测试(包括非常大且复杂的 Python 应用程序,而不仅仅是 10 行代码)时 非常快

您应该注意两种情况下 PyPy 无法 加速您的代码

  • 短运行进程:如果它没有运行至少几秒钟,那么 JIT 编译器将没有足够的时间预热。

  • 如果所有时间都花在运行时库(即 C 函数)上,而不是实际运行 Python 代码,那么 JIT 编译器将无济于事。

因此,PyPy 最适合执行长时间运行的程序,其中大部分时间都花在执行 Python 代码上。这是我们大多数 基准测试 所涵盖的情况,但并非全部 --- PyPy 的目标是获得速度,但仍然支持(理想情况下)任何 Python 程序。

内存使用情况

内存密集型 Python 程序(数百 MB 或更多)最终可能比在 CPython 中占用更少的空间。不过,情况并非总是如此,因为它取决于很多细节。还要注意,基线高于 CPython 的基线。

无栈

无栈 和 greenlets 的支持现在已集成到正常的 PyPy 中。更多详细信息请参见 此处

其他特性

PyPy 具有许多次要特性和半独立的项目。我们将在下面提到

沙盒

PyPy 的沙盒是运行不受信任的用户程序的理念的一个工作原型。与 Python 的其他沙盒方法不同,PyPy 的沙盒方法不会尝试限制被认为“不安全”的语言特性。相反,我们将所有对外部库(C 或平台)的调用替换为一个存根,该存根与处理策略的外部进程进行通信。

要运行沙盒进程,您需要获取完整的源代码并从中构建 pypy-sandbox(参见 从源代码构建)。这些说明为您提供了一个 pypy-c,您应该将其重命名为 pypy-sandbox 以避免将来混淆。然后运行

cd pypy/sandbox
pypy_interact.py path/to/pypy-sandbox
# don't confuse it with pypy/goal/pyinteractive.py!

您将获得一个完全沙盒化的解释器,它位于自己的文件系统层次结构中(尝试 os.listdir('/'))。例如,您可以按如下方式运行不受信任的脚本

mkdir virtualtmp
cp untrusted.py virtualtmp/
pypy_interact.py --tmp=virtualtmp pypy-sandbox /tmp/untrusted.py

请注意,路径 /tmp/untrusted.py 是沙盒文件系统内的路径。您根本不必将 untrusted.py 放在真实的 /tmp 目录中。

要详细了解其功能,请尝试 pypy_interact.py --help 或访问 我们的文档网站