执行模型变体——Python实现的可选方案——PyPy: 加速Python

未匹配的标注

PyPy 系统是另一个标准 CPython 的重新实现,主要关注性能。它用 JIT(just-in-time / 及时) 编译器提供了快速的 Python 实现,为 “沙盒” 模型(可以在一个安全环境中运行未信任代码)提供了工具,并且默认支持前面章节的 Stackless Python 系统和它的微线程以支持大规模并发。

PyPy 是之前描述过的 Psyco JIT 的继任者,并且整合了一个完整的为速度而生的 Python 实现。JIT 真的只是 PVM(图 2-2 最右边的气泡)的一个扩展,为了更快的执行,它将部分字节码彻底地翻译为二进制机器代码。它是在程序运行时做这件事,而不是在预先运行的编辑步骤中,并且通过跟踪程序处理的对象的数据类型,能为动态的 Python 语言创建特定类型的机器代码。通过这种方式替代部分的字节码,程序在执行时会运行得越来越快。另外,一些 Python 程序在 PyPy 下还会占据更少的内存。

在写本书时,PyPy 执行 Python 2.7 代码(3.X 还不行)并且运行在 Intel x86(IA-32)和 x86_64 平台上(包括 windows,Linux,和最近的 Macs),ARM 和 PPC 的支持还在开发中。它运行大多数的 CPython 代码,然而 C 扩展模块通常必须被重新编译,且 PyPy 有一些微小但微妙的语言差异,包括会让一些常见的编码模式无效的垃圾回收语义。比如,它的非引用计数方案意味着临时文件可能没有关闭,输出缓冲区没有立即刷新,且在一些情况下可能需要人工调用 “关闭” 方法。

作为回报,代码可能运行得快许多。PyPy 当前声称在一系列的性能跑分程序中的速度超过 CPython 5.7 倍(根据 http://speed.pypy.org/)。在一些情况下,它利用动态优化机会的能力可以使 Python 代码运行得和 C 代码一样快,偶尔会更快。特别对重度算法或数字程序更是如此, 如果不是有 PyPy,这些程序都可能用 C 重写。

比如,在第 21 章中将会看到一个简单的跑分测试中,当前的 PyPy 运行得比 CPython 2.7 快 10 倍,比 CPython3.X 快 100 倍。虽然其他跑分测试会有所不同,但在许多领域,这样的加速可能是一个令人信服的优势,甚至比尖端的语言功能更有优势。同样重要的,在 PyPy 中内存也被优化了 —— 在一个发表的测试案例中,PyPy 只需要 247MB 在 10.3 秒内就完成了,而 CPython 需要 684MB 和 89 秒。

PyPy 的工具链也足够通用,可以支持其他语言,包括 Pyrolog(一个使用 PyPy 翻译器用 Python 编写的 Prolog 解释器)。搜索 PyPy 的网站获取更多信息。PyPy 目前在 pypy.org/ ,然而随着时间推移,通常的网络搜索也还是可以找到很多资料(即使网址改变)。对于当前性能的概述,请见 www.pypy.org/performance.html

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~