对于大多数Python开发者来说,看懂Python香农计划有点难度,Python开发和开发Python是两码事,So大家先了解下基本的各种Python名词,以便可以阅读下去,不需要特别懂!
开发CPython相关知识点
HotPy / HotPy2 / VM ,Python 的高性能虚拟机,一个很古董的话题
GC ,Python的内存管理与回收
Cffi,Python调用C函数的接口
JIT,将解释性语言(比如Python,Java)生成机器码
PyPy,Python的JIT实现,超级快
Numba,使用 LLVM 实现的 JIT,专门用于数字类型 (numpy)
LLVM,使用C++11编写,比GCC更加现代化,模块化的编译器,各种动态语言(Java,.Net等)JIT实现必备的编译器
汇编代码(速度)=机器码(速度),JIT=机器码
普通Python代码的转换
Python -> C++ -> 汇编码 -> 机器码
Python(Numba,Taichi,PyPy) JIT的转换(运行一次后,部分py略过汇编代码)
Python+机器码(第二次运行) ->机器码 + C++(汇编码) ->机器码
Python使用Nuitka的转换
Python+C++ -> 汇编码 ->机器码
Python3.12解读一
和nuitka一样,只编译部分代码为C语言或者机器码,比如numpy,win32api模块本就是pyd的调用(不透明的C代码块),或者函数写的不符合C语言的类型,缺少类型或者Nonetype,这等代码不会去编译成机器码,编译失败的概率比较高
加速解释器中运行的代码,可以理解成部分代码编译机器码和优化后的C语言,比如for循环,类型确认,计数器等亟需优化的空间,便于C语言和机器码的运行,faster-cpython已经说明3.12会生成新的本地代码,某种意义上Python3.12开启了JIT,如下图加速CPython的实施方案
内存管理的开销,这是上面提及的GC,Python维护者一直努力在改进内存回收机制,内存占用越大运行越慢,这是必然的,特别是for循环
希望3.12的JIT不光解决数字型的,还解决其他已知类型的数值;不过文中暗示3.12只是一个小范围的JIT,大家还是不要报太多希望,Nuitka在这方面也遇到到极大的阻碍,在以往的版本更新中,nuitka维护者在C++代码转化中,也只转化了一部分数字计算和index类为C++,编程界的难题都是一样的
python3.12的JIT生成机器码
Python3.12解读二
Python3.12实现的前提
Python3.12优先转换没有return或者引用的功能性函数为C语言
针对99%的通用代码准备通用的C语言转换和优化模块(我不敢确定理解是否正确,在cffi上有优化空间是可以确定的)
同上
JIT之后,变量命名简化以及计数器上,回收方法上GC有极大的优化空间(下面会有讨论)
Python3.12解读三
Python 虚拟机中使用并发的内存管理机制,一个区别与Jython和IronPython的JIT解释器(翻译可能有误,欢迎大家指正)
优化已经能确定的方向和区域以及GC优化空间,比如已声明的类型,可判断的类型,计数,数值,可确定结果的函数和模块(Nuitka以前就是这么做的),这里开发者有大量的工作任务
开发者有一个判断优化的标准或者测试模块和数据请参考,我没有直接按字面意思去翻译,各位看官结合文档来看,轻喷
补充优化的评测标准,再次补充优化的内容
JIT和C语言的一些代码转化的标准化,JIT必备;这些坑在我们QQ群以前遇到好多类似的提问
Python3.12解读四
在3.12的版本中JIT和内存管理占了很大的板块,JIT带来了可操作的空间(转化机器码后减少一部分解释代码),加上本身cpython也有很大的操作空间,可参考大佬的文章,GC这一块的优化摘抄如下图
前面我们提到的值和数值,特别是最新爆火的ordered-set,极大提速了大家对Python加速类型的可能性
#125有效的减少了内存的占用 (突然觉得nuitka的混淆变量名设置的新名字好大方,取名都是那么长的)JIT之后的新命名是Class A,Class B,Class D,Class E.......也可见faster-cpython的开发者用心良苦和认真