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。
考虑以下代码片段:
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。