Google 在很多的应用项目中使用了Python,例如内部的服务器监控以及对外的Google Groups等。 所以Google很自然的希望提高Python的性能。一组Google的开发人员效力于一个名为Unladen Swallow的Python分支,该项目致力于改善Python的执行效率。Unladen Swallow的目标是将Python的性能提高五倍。为了实现该目标,将增加JIT的支持,并对虚拟机进行重新设计。在性能提升的同时,依旧会与CPython保证源代码级别的兼容。
Unladen Swallow 的项目领导者及核心开发人员 Collin Winter、Jeffrey Yasskin、Thomas Wouters 长期作为 CPython 的核心开发人员,从事reference的实现以及通用解释器方面的工作。以上的三位都为Google员工,他们贡献自己的20%的自由工作时间给Unladen Swallow。但是这个组织坚持认为这是一个Python项目,而非Google所有。
Winter 说,这个想法的产生可以追溯到他在为Mondrian(一个基于WEB的code review工具)工作时。那时团队试图进行性能优化时不断的触及到CPython的局限,例如全局解释器锁(GIL)的存在,使之难以发挥多核的威力。在研究了潜在的性能提升方案之后,Winter和其他的Google工程师最终认为有必要开启一个独立的分支。此外,这么做可以让他们在将想法反馈到CPython之前能有一个强有力的测试。
Unladen Swallow的核心计划是移除Python虚拟机设计中的瓶颈,但是保留其余的解释部分 — 不涉及到大量的runtime library — 理论上不做任何处理。 远期目标是使用Low Level Virtual Machine (LLVM)来构建register-based虚拟机以替换当前的stack-based虚拟机,同时为新虚拟机再加just-in-time compiler (JIT)。与此同时,其他基于性能的改善同样是受欢迎的。
JIT通过将代码编译成机器码,这样可以减少翻译Python指令的时间,以此提高代码的执行速度。“在CPython里,” Winter 解释道,“这一部分的开销很大;在这方面只做了较小的调整就使CPython 2.7有了近15%速度提升。”
就目前而言,增加JIT是将stack-based的虚拟机有切换到LLVM的register-based设计的一个好时机,Winter说这将充分发挥其性能优势。stack- vs register-based 的争论一直存在,但是Winter引用了Lua项目register-based设计的经验 2005 study [PDF]。
Unladen Swallow 基于Python 2.6.1,不过这并不是最近的一个Python发行版。Python 3.0 发布于 2008年11月,当前的Unladen Swallow实现和Python 3.0并不兼容。这主要是由于目前外部大量Python用户以及Google内部都在使用Python 2.x。Unladen Swallow项目组认为将精力关注于这个早期版本将可以带来更多的利益。通过基于CPython,Unladen Swallow可以与现有的Python代码实现100%的代码级兼容。
Winter说,该小组同Python设计师 Guido van Rossum(他也是谷歌的员工)以及其他的CPython团队成员保持密切联系。 “在我们同Guido和其他人员讨论如何以及在何时将改动并入到CPython时,提出了Unladen Swallow应当合并到3.x的想法。3.x是这么语言的未来,如果3.x明显的快于2.x,那对迁移2.x的应用和库到3.x上将是一个极大的动力。没有东西是一成不变的,或许Guido会改变他的主意。”
开发团队为Unladen Swallow制定了一个严格的时间表,将在每季发布一个里程碑。第一个发布版本是2009Q1,这个阶段相对保守,通过对现有CPython的少量修改来实现25到35%性能提升。这些改动包括利用vmgen对eval循环的实现进行重写,多项 垃圾回收的改善 — 更好的追踪长生命周期对象以减少垃圾回收的次数 — 系列化的数据模块cPickle性能提升,对Web应用程序的性能改善更为明显。收发操作码(opcodes)将由相同功能的Python函数替换,这项改动可以减少代码量,不过并不能带来性能上的明显提升。
Unladen Swallow 2009Q1 可以从公共的SVN代码库中得到,具体位置为branch。由于为保证与CPython的紧密同步,没有提供特殊的编译参数,不过为了充分的利用性能提升建议以64位模式编译。
由于主要是以性能为目标,开发团队进行了完备的性能测试。 这三组测试方案力求于接近真实世界的应用,特别是web应用。Unladen Swallow 2009Q1 和 CPython 2.6.1 的对照测试结果发布在项目wiki上;Unladen Swallow在各个测试项上比CPython快7.43%到157.17%。
按照计划目前正在进行2009Q2。Q2会集中力量来废除Python的虚拟机,并用一个具有相同功能的基于LLVM的实现将其代替。
其他一些试图改进Python执行效率的项目。Psyco 一个较早的Python JIT实现,这个项目在稍后被 PyPy 取代。PyPy的主要目标是使用Python来实现Python,而非是性能。Stackless Python通过使用自己的调度实现和特殊的primitives(tasklets)来改善并发性能。最后,Parrot 使用自己的register-based VM来实现Python。
从某些意义上讲Unladen Swallow相比上述项目更具野心,尤其在考虑到开发者在路线图上宣称的速度提升。从另一方面讲,Unladen Swallow基于CPython 2.6.1的代码,同时引入大量的CPython开发者,这将极大的增加其成为官方CPython实现的可能性。大量2009Q1的改动已经提交给了CPython,3.0系列也在计划中,借助于JIT和VM性能的改善,估计能有4倍的提升。
【本文翻译仅为外语学习及阅读目的,原文作者个人观点与译者及译言网无关】