我听说了很多关于PyPy项目的事情。他们声称它比他们网站上的CPython解释器快6.3倍。
每当我们谈论像Python这样的动态语言时,速度是首要问题之一。为了解决这个问题,他们说PyPy要快6.3倍。
第二个问题是并行性,即臭名昭著的全局解释器锁(GIL)。为此,PyPy说它可以提供无gil的Python。
如果PyPy可以解决这些巨大的挑战,那么它的弱点是什么?也就是说,是什么阻止了像我这样的典型的Python开发人员现在转向PyPy ?
我听说了很多关于PyPy项目的事情。他们声称它比他们网站上的CPython解释器快6.3倍。
每当我们谈论像Python这样的动态语言时,速度是首要问题之一。为了解决这个问题,他们说PyPy要快6.3倍。
第二个问题是并行性,即臭名昭著的全局解释器锁(GIL)。为此,PyPy说它可以提供无gil的Python。
如果PyPy可以解决这些巨大的挑战,那么它的弱点是什么?也就是说,是什么阻止了像我这样的典型的Python开发人员现在转向PyPy ?
当前回答
I did a small benchmark on this topic. While many of the other posters have made good points about compatibility, my experience has been that PyPy isn't that much faster for just moving around bits. For many uses of Python, it really only exists to translate bits between two or more services. For example, not many web applications are performing CPU intensive analysis of datasets. Instead, they take some bytes from a client, store them in some sort of database, and later return them to other clients. Sometimes the format of the data is changed.
BDFL和CPython开发人员是一群非常聪明的人,他们设法帮助CPython在这种情况下表现出色。这是一个无耻的博客:http://www.hydrogen18.com/blog/unpickling-buffers.html。我使用的是Stackless,它源自CPython,并保留了完整的C模块接口。在这种情况下,我没有发现使用PyPy的任何优势。
其他回答
因为pypy不是100%兼容,需要8g的ram来编译,是一个移动的目标,并且是高度实验性的,其中cpython是稳定的,20年来模块构建器的默认目标(包括不能在pypy上工作的c扩展),并且已经广泛部署。
Pypy可能永远不会成为参考实现,但它是一个很好的工具。
问:如果与CPython相比,PyPy可以解决这些巨大的挑战(速度、内存消耗、并行性),那么它的弱点是什么?
答:首先,几乎没有证据表明PyPy团队可以解决一般的速度问题。长期的证据表明,PyPy运行某些Python代码比CPython慢,这个缺点似乎深深植根于PyPy。
其次,在相当大的一组情况下,当前版本的PyPy比CPython消耗更多的内存。所以PyPy还没有解决内存消耗的问题。
PyPy是否解决了上面提到的巨大挑战,并且通常会比CPython更快,更少的内存消耗,对并行更友好,这是一个悬而未决的问题,短期内无法解决。有些人打赌,PyPy将永远无法提供一个通用的解决方案,使其在所有情况下都能主导CPython 2.7和3.3。
如果PyPy在总体上比CPython更好,这是值得怀疑的,影响其更广泛采用的主要弱点将是它与CPython的兼容性。还有一些问题,比如CPython在更广泛的cpu和操作系统上运行,但与PyPy的性能和CPython兼容性目标相比,这些问题要重要得多。
问:为什么我现在不能用PyPy替换CPython ?
答:PyPy并不是100%与CPython兼容,因为它没有在底层模拟CPython。一些程序可能仍然依赖于CPython的独特特性,而这些特性在PyPy中是不存在的,比如C绑定、Python对象和方法的C实现,或者CPython垃圾收集器的增量特性。
I did a small benchmark on this topic. While many of the other posters have made good points about compatibility, my experience has been that PyPy isn't that much faster for just moving around bits. For many uses of Python, it really only exists to translate bits between two or more services. For example, not many web applications are performing CPU intensive analysis of datasets. Instead, they take some bytes from a client, store them in some sort of database, and later return them to other clients. Sometimes the format of the data is changed.
BDFL和CPython开发人员是一群非常聪明的人,他们设法帮助CPython在这种情况下表现出色。这是一个无耻的博客:http://www.hydrogen18.com/blog/unpickling-buffers.html。我使用的是Stackless,它源自CPython,并保留了完整的C模块接口。在这种情况下,我没有发现使用PyPy的任何优势。
对于许多项目,不同的python之间在速度方面实际上是0%的差异。这是由工程时间主导的,所有的python都有相同数量的库支持。
CPython有引用计数和垃圾收集,PyPy只有垃圾收集。
因此,对象倾向于更早地删除,并且在CPython中以更可预测的方式调用__del__。有些软件依赖于这种行为,因此它们还没有准备好迁移到PyPy。
其他一些软件可以同时使用这两种方法,但使用CPython时使用的内存更少,因为未使用的对象会更早释放。(我没有任何测量方法来表明这有多重要,以及其他哪些实现细节会影响内存使用。)