执行模型变体——python实现的可选方案——pypy: 加速python | 第一部分 开始 —— 第 2 章: python 是如何运行程序的 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-380玩彩网官网入口
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倍(根据 , 如果不是有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目前在 ,然而随着时间推移,通常的网络搜索也还是可以找到很多资料(即使网址改变)。对于当前性能的概述,请见 。