为什么PyPy翻译如此缓慢?

问题描述:

需要花费数小时将pypy实现转换为c文件,并在具有2G内存和Intel Core2 2GHz CPU的现代笔记本电脑上构建pypy-c。为什么PyPy翻译如此缓慢?

我知道这是一个cpu密集型任务,但它是否必须如此缓慢?是否有机会或空间来减少计算,重新安排计算顺序并将时间减少到几十分钟?

免责声明:我不是PyPy专家 - 特别是,我不明白RPython翻译的细节,我只列举docs什么overheared在邮件列表,并在博客上。

“CPU密集型任务”?本月低估提名。我自己并不十分理解翻译过程的细节,但即使我可以告诉你,它的每个分析和优化过程都会对很多代码做很多非常复杂的工作。

  1. 它开始正常运行Python代码,例如,导入模块,执行模块级变量定义,定义函数和类,应用装饰器等等。在某些时候,当“足够静态”应该被实现时,它停止并继续实际的翻译过程。
  2. 它采用冻结的内存中正在进行的Python程序,并将其全部运行在模拟流量控制,变量的可能值等的特殊对象空间中。它本质上是象征性地运行解释器!它这样做是为了执行类型推断(在像Python这样的语言中一切都很简单)和附加分析。
  3. 结果被转换为低级代码。
  4. 可选地,大量的优化(默认情况下启用,我猜)和一个复杂的无栈支持转换(默认情况下禁用,我猜)遵循。
  5. 然后它将所有东西放到适合指定后端的类型系统中,生成数百万行代码(从最近的邮件列表条目看来,至少有19个.c文件,并且其中至少有一个包含至少247,560行 - 就是让你对我们正在谈论的数量级有所了解)。
  6. 所有的代码都是用gcc -O2或类似的代码编译的,当然这些代码有很多解析和检查工作,而且本身会有许多分析和优化工作要做。

所以是的,这是一个相当吓人的巨大任务。难怪你的弱小CPU丢失了。作为参考,当benchmarking the translation process in November 2010时,PyPy人使用了Intel Xeon W3580(3.33 GHz)。它仍然花费了大约76分钟,即使它们也有12 GB的RAM - 这导致了下一个问题:在此过程中需要很多RAM的(64位Ubuntu上2.3 GB的时候,不知道数字如何转化为你的情况)。我很肯定你最终会超过你的体能内存 - 输入过多的交换和相关的踢到性能的腹股沟。

结合你可以有几个其他程序运行窃取CPU时间和内存的事实,在我看来,你的体验非常好。翻译PyPy保留给更强大的计算机。如果有什么能够从根本上改善这些时间,像我们这样的外部人士不太可能找到它。我会把这些问题留给开发者。

+1

感谢您的快速回答。由于我没有太多内存,所以我使用官方的python来运行翻译,这可能使得这个过程比根据文档应该更长,但是我确实在我的可怜的机器上成功地构建了pypy。 – jaimechen 2011-05-27 18:24:06