PyPy JIT 调用优化

PyPy JIT calling optimization

考虑以下代码片段:

class Duck:
    def duck(self):
        pass

ducks = [Duck() for i in range(10)]
for duck in ducks:
   duck.duck() #<-----

duck.duck() 调用是否会被动态调度(即每次执行方法查找时),或者 JIT 将能够推断出我们正在迭代稳定的鸭子列表并替换使用 mem+offset 调用?

如果是,那么我自己怎么能看到它(即如何检查 IR 代码,如果有或生成的程序集);如果不是,那是为什么?

PyPy 团队中的人们正在研究一种合理的方式来为外部人员做到这一点。同时,这里是当前查看由 JIT 编译器生成的 IR(以及可选的机器代码)的方法的说明。

这些说明已在 Linux 上进行了测试。他们还应该在 OS/X 上工作。对于 Windows,您需要像往常一样调整大多数命令的语法。

  • 查看主 PyPy 存储库的副本(需要很长时间!):例如对于 5.x 版本,hg clone https://bitbucket.org/pypy/pypy -r release-5.x -u release-5.x pypysrc

  • 为 PyPy 安装 https://bitbucket.org/pypy/jitviewer(通常我们通过 hg clone https://bitbucket.org/pypy/jitviewer 检查它,然后 virtualenv -p pypy pypy-venv; . pypy-venv/bin/activate; cd /path/to/jitviewer; pypy setup.py install

  • 运行 你的示例程序是这样的:PYPYLOG=jit:log pypy mytest.py;这会生成一个名为 log

  • 的文件
  • 通过启动 PYTHONPATH=/path/to/pypysrc jitviewer.py --log log 查看日志,然后在 http://127.0.0.1:5000/ 查看 url。