关于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慢。
Stellungnahme:Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn