将 pypy 实现转换为 c 文件并在具有 2G mem 和 Intel Core2 2GHz CPU 的现代笔记本电脑上构建 pypy-c 需要几个小时。
我知道这是一个 CPU 密集型任务,但是有必要这么慢吗?有没有机会或者空间来减少计算量,重新安排计算顺序,把时间缩短到几十分钟?
免责声明:我不是 PyPy 方面的专家 - 特别是,我不了解 RPython 翻译的细节,我只是引用docs http://doc.pypy.org/en/latest/translation.html#overview以及在邮件列表和博客中无意中听到的内容。
“CPU 密集型任务”?被提名为本月轻描淡写的作品。我自己不太了解翻译过程的细节,但即使我可以告诉你,它的每一个分析和优化过程都会对大量代码进行大量非常复杂的工作。
- 它开始正常运行Python代码,例如导入模块,执行模块级变量定义,定义函数和类,对其应用装饰器等。在某些时候,当应该实现“足够的静态性”时,它会停止并继续实际的翻译过程。
- 它采用冻结的内存中进行中的 Python 程序,并在一个特殊的对象空间中运行所有程序,该对象空间模拟流程控制、变量的可能值等。它本质上是象征性地运行解释器!它这样做是为了执行类型推断(在 Python 这样的语言中一切都很简单)和附加分析。
- 结果被转换为低级代码。
- 或者,随后进行大量优化(我猜默认情况下启用)和无堆栈支持的复杂转换(我猜默认情况下禁用)。
- 然后,它将所有这些内容降低到适合指定后端的类型系统中,生成数百万行代码(从最近的邮件列表条目来看,似乎至少有 19 个 .c 文件,并且其中至少一个包含至少 247,560 个行 - 只是为了让您了解我们正在讨论的数量级)。
- 所有代码都是用
gcc -O2
或类似的,当然有很多解析和检查要做,并且本身也有很多分析和优化过程要做。
是的,这是一项非常艰巨的任务。难怪你那微不足道的CPU会丢掉。作为参考,PyPy 人员在使用 Intel Xeon W3580 (3.33 GHz) 时2010 年 11 月对翻译流程进行基准测试 http://morepypy.blogspot.com/2010/11/snake-which-bites-its-tail-pypy-jitting.html。尽管他们也有 12 GB RAM,但他们仍然花了大约 76 分钟 - 这导致了下一个问题:A lot在此过程中需要 RAM(当时 64 位 Ubuntu 上需要 2.3 GB,不知道这些数字如何转换为您的情况)。我很确定你最终会超出你的物理内存 - 输入过多的交换和相关的性能影响。
再加上您可能有其他几个程序正在运行,窃取 CPU 时间和 RAM,我认为这很好地解释了您的经历。翻译 PyPy 是为更强大的计算机保留的。如果有什么东西可以从根本上改善这个时代,像我们这样的局外人就不太可能找到它。我会把这些担忧留给开发人员。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)