为什么PyPy翻译得这么慢?

jai*_*hen 9 pypy

将pypy实现转换为c文件并在现代笔记本上构建pypy-c需要几个小时,具有2G内存和Intel Core2 2GHz CPU.

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

小智 12

免责声明:我不是PyPy的专家 - 特别是,我不了解RPython翻译的细节,我只是引用了文档以及在邮件列表和博客中偷听的内容.

"CPU密集型任务"?被提名为本月的轻描淡写.我自己并不太了解翻译过程的细节,但即使我可以告诉你,它的几个分析和优化过程中的每一个都会对很多代码进行大量非常复杂的工作.

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

所以,是的,这是一个非常令人毛骨悚然的巨大任务.难怪你失去了微不足道的CPU.作为参考,PyPy家伙在2010年11月对翻译流程进行基准测试时使用了英特尔至强W3580(3.33 GHz).它仍然需要大约76分钟,即使它们还有12 GB的RAM - 这导致了下一个问题:在这个过程中需要大量的RAM(当时64位Ubuntu上的2.3 GB,不知道如何数字转换为您的情况).我很确定你最终会超过你的物理内存 - 进入过多的交换和相关的性能腹股沟.

结合你可能有其他几个程序运行窃取CPU时间和内存的事实,我认为你的经验非常好.翻译PyPy是为更强大的计算机保留的.如果有一些东西可以从根本上改善这些时间,像我们这样的局外人不太可能找到它.我会把这些烦恼留给开发者.