为PyPy的JIT编写高效代码的指南

14 投票
1 回答
2832 浏览
提问于 2025-04-16 13:46

PyPy的即时编译(JIT)可以让Python代码运行得比CPython快很多。那么,有没有一些写代码的建议,可以让JIT编译器更好地优化代码呢?比如,Cython可以把一些静态代码编译成C++,而且它有一些写高效代码的指南。那么,PyPy有没有类似的好习惯呢?我知道PyPy项目有一些关于在为其他动态语言编写自己的JIT启用解释器时包含提示的指南,但这对大多数使用这个框架的普通用户来说并不相关,他们只是简单地使用解释器。我想了解的问题包括:

  1. 把脚本打包成函数
  2. 明确删除变量
  3. 给变量类型提供提示或暗示的可能方法
  4. 以特定方式编写循环

1 个回答

13

PyPy的wiki在BitBucket上有一部分讲的是JIT友好性。一些博客文章提供了更多建议,帮助你让代码在PyPy中运行得更快。简单来说,写得规范的代码,如果没有强迫解释或实现框架,应该是快的,如果不快,那就是个bug。

我知道对于3,有些像“assert x > 0”这样的语句可能会有用,但我不记得在哪里看到过。我也相信我见过一些关于在循环中重构条件路径的建议,和4有关(编辑:这似乎现在过时了)。

这里有一个讨论相关话题的线程。你可以用jitviewer来检查你的代码的JIT效果,但这有点复杂。如果你在Freenode的#pypy频道里发问,可以得到关于jitviewer和你特定代码的帮助。

2020年以后

自从2020年PyPy迁移到Heptapod后,JIT友好性的信息已经转移到这里:https://foss.heptapod.net/pypy/pypy/-/wikis/JitFriendliness

更多性能信息可以在这里找到:https://www.pypy.org/performance.html

撰写回答