说明:由于我是开发成员之一,本文原文在起草过程中我也做了修改,所以这里就以半作者半译者的形式发出来了。译文几乎与原文同步发布,如有错别字请指正。

今天我们非常激动的宣布Pyston这款高性能Python JIT发布了0.5版本。过去几个月我们一直都没有什么新消息,这是因为我们在幕后憋新东西,现在是时候放出来了。如果我们选择其他方向去突破,或许能让成果更加耀眼。不过这次憋出来的新东西让Pyston更具有实用性。

Pyston现在使用与CPython相同的引用计数垃圾回收方式了。

引用计数

引用计数是一种自动内存管理的形式。与追踪式垃圾回收器(GC,注:本文中认为引用计数不是GC的一种,所以下面的“垃圾回收”一词并不包括引用计数,请注意)比起来,人们通常认为引用计数比较简单,且速度较慢。之前版本的Pyston都使用了追踪式垃圾回收器,而从0.4到0.5,我们花了很大力气切换到了引用计数的方式。

我们为什么换回引用计数呢?因为CPython(主要的Python实现)使用引用计数。之前我们试图使用垃圾回收(GC)来获取性能提升。但CPython API基于引用计数,使用追踪式垃圾回收实现这些API会带来许多性能问题。而Pyston具有一个非常有挑战性的目标,即Pyston希望支持海量的针对CPython引用计数方式实现的已有代码(如当引用计数减为0后立即回收对象)。在支持CPython的第三方库过程中,会一直遇到很多兼容性的问题,其中有些甚至无法在当前的框架下解决。

为了获得与CPython更好的兼容性,于是我们咬咬牙切换到了引用计数,

大家觉得我们做的怎么样?

NumPy

我们很高兴的宣布Pyston可以无障碍的运行NumPy。

说明:对于最新的NumPy 1.11,Pyston运行其测试套件只有一个错误,而这个错误出自NumPy上游。我们已经提交了一个补丁给NumPy来修复这个问题。对于最新的master库,Pyston运行NumPy测试还有3个错误。为了在Pyston中编译NumPy,需要使用修改过的Cython,同时现在在Pyston中运行NumPy测试套件要比CPython慢一点。

这里我补上NumPy在Pyston中的运行时间吧(CPython在我的机器上大概需要30-40s):

1 Ran 6139 tests in 102.170s

不管怎样,我们对于这个结果很满意,特别是我们会继续改进兼容性并提升性能。

其他方面

这个版本还包括许多其他改进:

  • 信号处理
  • Frame introspection of exited frames(这里怎么翻译都不得体,先这样吧)
  • Generator cleanup
  • 支持更多的C API,如custom tracebacks
  • 许多其他小的修复

在支持NumPy的过程中受益良多,如顺带中支持了其他一些库(py.test、lxml、cffi)。同时之前我们对来自CPython的标准库和C扩展做了很多修改,现在这些修改已经改回去了。总之,使用引用计数是个非常大的投资,这个投资让我们更好的兼容CPython,否则我们要花很多时间去兼容CPython。

性能提升

很遗憾,由于性能提升并不是这个版本的目标,所以性能方面还有所下降。0.5版比0.4慢了10%,很大一部分是由于切换到了引用计数上。由于过去6个月我们只是关注在兼容性上,同时我们的引用计数的实现仍然有许多改进空间,所以对于这个结果我们目前可以接受。

从另一方面来说,人们一般会认为引用计数比垃圾回收要慢。但我们认为垃圾回收的实现方式在兼容性方面有所阻碍(注:想想PyPy吧)。

目前Pyston在性能上还有许多可供改进的地方,但在完成引用计数的过程中我们都没有去实现。现在我们有 许多issue,有兴趣的贡献者可以去看看,有些可以改进NumPy的性能。

目前,在Pyston中运行NumPy测试套件的耗时是CPython的两倍多。我们不知道对于实际的NumPy程序,性能会有什么差异,但我们知道性能下降主要由于两方面:一是NumPy执行了一些Pyston中目前没有优化的代码路径;第二点有点微妙:NumPy的执行过程经常从C代码回到Python运行时,Pyston处理这方面很耗时,因为我们的JIT目前无法在此进行优化。Pyston中有方法来处理这种情况,并从C代码中调用JIT,我们计划应用这些方法,让NumPy和其他库能从中受益。

将来

我们为这么长的发布周期再次道歉。我们没有预料到添加引用计数会耗时这么久。我们计划再发布一篇博客来介绍切换到引用计数过程中遇到的难点,以及Pyston引用计数实现的的细节。

在将来,Pyston 0.6会侧重于性能方面。我们乐于从社区得到反馈,来决定那些方面需要优化性能。我们可以改善NumPy测试套件运行时间,不过这些改善或许不会反映到实际的NumPy程序中。

现在我们希望能通过docker让用户更方便的尝试Pyston,或许这无法应付所有情况,但可以让人们更好的尝试Pyston:

1 docker run it pyston/pyston

也可以阅读我们的 readme 来了解其他获得Pyston的方法。若要尝试NumPy,使用“pyston/pyston-numpy”命令。

我们已经有了若干优化的主意,但我们不希望“这一点点改进”延误0.5的发布。我们可能会发布0.5.1来添加这些性能改进。

结语

引用计数让Pyston在成为CPython完美替代品的道路上又前进了一步。当前仍有许多工作需要做,但我们觉得有了引用计数后,就快达到让用户使用的地步了。但Pyston仍然是在开发中的软件,所以会有许多问题和未优化的情形。但我们希望能得到您的反馈,来了解哪些可以工作,哪些无法工作。

最后,我们想感谢所有对这个版本有帮助的Pyston开源贡献者。特别是 Nexedi 雇员孙波翔,他是我们的核心贡献者,对NumPy的支持帮助很大。

  • Boxiang Sun(我)
  • Dong-hee Na 韩国人。。。
  • Rudi Chen 这是加拿大人,华裔。
  • Long Ang 这个是来自leancloud的国人,公司主页:https://leancloud.cn/ 大家可以去了解一下。
  • @LoyukiL
  • Tony Narlock
  • Felipe Volpone
  • Daniel Milde
  • Krish Monut
  • Jacek Wielemborek

对了,介意在下面打赏我一下吗。。。