Python3.12的加速与JIT解读

2024年 1月 27日 50.5k 0

对于大多数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解读一

    Python3.12的加速与JIT解读

  • 和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的JIT生成机器码

    Python3.12解读二

    Python3.12的加速与JIT解读Python3.12实现的前提

  • Python3.12优先转换没有return或者引用的功能性函数为C语言
  • 针对99%的通用代码准备通用的C语言转换和优化模块(我不敢确定理解是否正确,在cffi上有优化空间是可以确定的)
  • 同上
  • JIT之后,变量命名简化以及计数器上,回收方法上GC有极大的优化空间(下面会有讨论)
  • Python3.12解读三

    Python3.12的加速与JIT解读Python3.12的加速与JIT解读

  • Python 虚拟机中使用并发的内存管理机制,一个区别与Jython和IronPython的JIT解释器(翻译可能有误,欢迎大家指正)
  • 优化已经能确定的方向和区域以及GC优化空间,比如已声明的类型,可判断的类型,计数,数值,可确定结果的函数和模块(Nuitka以前就是这么做的),这里开发者有大量的工作任务
  • 开发者有一个判断优化的标准或者测试模块和数据请参考,我没有直接按字面意思去翻译,各位看官结合文档来看,轻喷
  • 补充优化的评测标准,再次补充优化的内容Python3.12的加速与JIT解读

    JIT和C语言的一些代码转化的标准化,JIT必备;这些坑在我们QQ群以前遇到好多类似的提问Python3.12的加速与JIT解读

    Python3.12解读四

    Python3.12的加速与JIT解读

  • 在3.12的版本中JIT和内存管理占了很大的板块,JIT带来了可操作的空间(转化机器码后减少一部分解释代码),加上本身cpython也有很大的操作空间,可参考大佬的文章,GC这一块的优化摘抄如下图
  • 前面我们提到的值和数值,特别是最新爆火的ordered-set,极大提速了大家对Python加速类型的可能性
  • #125有效的减少了内存的占用 (突然觉得nuitka的混淆变量名设置的新名字好大方,取名都是那么长的)JIT之后的新命名是Class A,Class B,Class D,Class E.......也可见faster-cpython的开发者用心良苦和认真
  • Python3.12的加速与JIT解读Python3.12的加速与JIT解读

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论