学习Pyjion
相关的资源链接
Pyjion的GitHub地址。Pyjion的完整文档可以参考这里。Pyjion的安装及其依赖安装都可以在这里和这里找到。
Pyjion是Cython 3.10的JIT扩展(drop-in),它可将用户的Python代码编译为native CIL,并使用 .NET CLR执行它。Pyjion使得用户无需修改代码即可得到更快的执行速度。
此外,这里对比了Pyjion和其他现有编译工具,需要特别注意。
基本使用
Pyjion只能在Python 3.10环境下导入才有效。调用pyjion.enable()可以将编译阈值设置为0,此时代码只需要运行一次就可以被JIT编译。该API对Python代码透明,即后续的代码无需修改即可被JIT编译。Pyjion将把后续用户定义的函数即时编译成机器码,并将该编译函数的缓存版本存储在函数对象中。要查看编译信息,可以把想要查看的函数传入pyjion.info(f)。此外,Pyjion也提供了命令行工具,具体可以参考API文档中关于命令行的部分。
用户可以通过在Python REPL(交互解释器)中反汇编来查看已编译函数的机器码。Pyjion基本上已将用户的小型 Python函数编译成一个小型的独立应用程序。
CIL反汇编器
有关CIL可以参考百度百科对其的解释。Pyjion编译器使用ECMA 335 CIL作为其中间语言。用户可以使用pyjion.dis.dis(f)这个API来查看编译函数f的中间语言。另外,此API还有一个include_offsets 参数,启用它可以打印 Python操作码的序列点(作为注释出现)。
ps: pyjion.il(f)这一API将把ECMA CIL字节码作为bytearray进行返回。
X86_64反汇编器
此反汇编器使用了distorm3,推荐在运行反汇编程序之前先disable Pyjion,因为它会JIT编译distorm3(这是巨大工作量的)。相关的API是pyjion.dis.dis_native(f)。该API的include_offsets 参数与上述API类似,启用后可以打印出Python字节码的偏移量(作为注释出现)。
Pyjion可以在编译过程中为任何函数创建 .dot(graphviz)graph,如下:
import pyjion
pyjion.enable()
pyjion.config(graph=True)
启用此功能并编译函数后,用户就可以使用函数获取图形pyjion.graph(f)来对graph进行查看,并将输出用GraphViz Online 工具进行可视化。
使用WSGI中间件
WSGI是什么,可以参考这里。
Django
对于Django来说,可以使用pyjion.wsgi.PyjionWsgiMiddleware(application)来包装django.core.wsgi.get_wsgi_application ,以使用Pyjion的WSGI中间件。该API为request提供可以启用JIT的WSGI中间件接口。
Pyjion是一个JIT编译器。 它将本机CPython字节码编译成机器码。 没有Pyjion,CPython使用master evaluation loop(称为frame evaluation loop)来迭代操作码。Pyjion编译器有如下三个主要阶段:
- Build a “stack table” of the abstract types at each opcode position;
- Compile CPython opcodes into CIL opcodes;
- Emit the CIL opcodes into the .NET EE compiler to convert to native machine code/assembly;
指导原则
所有的优化都必须服从这些原则:它们必须支持自定义对象;它们必须通过CPython测试套件;它们必须是隔离的和可测试的;它们必须是原子的和简单的。
|