执行模型变体——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
发起讨论 查看所有版本


暂无话题~