pypy为什么会比cpython还要快?

关于pypy的性能网上有很多资料,如[1];在oolps2009会议的论文[2]里也有对性能的说明(我没有完全看懂),大意是讲:原生的解释器无法获得程序的一些信息,无从优化,而pypy就可以。我的问题是pypy为什么比cpython还要快?[1] http://speed.pypy.org/[2] http://codespeak.net/pypy/extradoc/talk/icooolps2009/bolz-tracing-jit-final.pdf[3] http://codespeak.net/pypy/extradoc/talk/dyla2007/dyla.pdf谢谢,江疆的回答,但我仍然有疑问。cpython也有几个带jit的分支,如unladen swallow[4],那么unladen swallow或者类似的方案和pypy相比呢?[4]http://www.python.org/dev/peps/pep-3146/回复内容:
pypy 的性能在没有 jit 的情况下和 cpython 是差不多的 (大概慢一到四倍 [1]),用了 jit 就能超出几十到数百倍都有可能了,这和其他的动态语言优化手段差不多,比如目前大部分的 javascript 引擎。另外自动内存管理也是性能提升的一个因素,但相比 jit 影响不大 [2]。unladen swallow 的 jit 是用 llvm 实现的,最近这篇 us 开发者的总结 [3] 提到,他们一开始选择用 llvm 是为了节省开发的工夫,但后来发现 llvm 主要还是为了静态的语言生成实现的,用于 jit 并不够给力。相比起 pypy 来 unladen swallow 更像一个改良的方案,所以优化可以发挥的余地并不大。cpython 本身的 code base 质量是很高的,这也是为什么传统优化方法不容易提高性能的原因。另外,不要把 pypy 简单理解为“自解释”,请至少读读 pypy 网站的基本介绍。[1] http://codespeak.net/pypy/dist/pypy/doc/faq.html#id19[2] http://stackoverflow.com/questions/2591879/pypy-how-can-it-possibly-beat-cpython[3] http://qinsb.blogspot.com/2011/03/unladen-swallow-retrospective.html
pypy比较快的原因是 pypy有一个jit能把python的字节码转换到机器语言。而且这个jit还是带tracing功能的,能融合和内联函数。如果对比的c程序没有合适的inline函数,在少数情况下可能会比pypy慢。

Posted in 未分类

发表评论