事件回顾不久前,Python核心开发者Pablo在邮件中宣布,由于一些重要的性能bug和崩溃,Python3.11预计年底发布10月,稳定版可能会推迟到12月发布。图片来源@邮件抱报这件事引起了很多人的关注。Python是当今最流行的编程语言之一。StackOverflow2022开发者报告显示,对于初学者来说,HTML/CSS、Javascript和Python几乎并列为最常用的语言。从排名来看,Python语言高居榜首,因此Python语言新版本的发布通常会备受关注。自2008年12月3日发布Python3.0以来,Python官方计划每年发布一个新版本,每次添加两到三个新语法。虽然实际情况并没有严格按照计划执行,但是从3.8版本开始,Python的发布节奏基本遵循了规律:在每个版本发布之前,都有17个月的开发周期,期间不断的开发和测试;测试期间,先发布alpha版,4月再发布beta版,10月左右发布最终正式版。Python3之前版本的发布时间原计划在今年发布。3.11版本也是按照这个节奏进行的,不过这一次,3.11版本的发布却成了一个例外。值得一提的是,在邮件的最后,Pablo对在12月发布稳定版没有信心。图片来源@mail截图Python3.11期待已久。Python虽然简单易学,但其运行速度慢一直为人诟病(在每一次编程语言速度竞赛中,Python通常排名垫底),因此很多开发者都期待这种语言的性能得到提升。或许正因如此,Python创始人GuidovanRossum重出江湖后在2021年Python语言峰会上做了分享。他说,他已经投资了“香农计划”(“ShannonPlan”,以提议者马克·香农的名字命名),预计用4年时间将Python加速5倍,即每年1.5倍。最近的计划是在Python3.11版本中实现至少1倍的速度。根据7月6日发布的Python3.11.0b3,在UbuntuLinux上使用GCC编译并使用pyperformance基准套件进行测量时,CPython3.11平均比CPython3.10快25%。根据工作负载,CPython3.11提供10%到60%的加速。图片来源@文档截图另外,由于Python3.11是一个较大的版本更新,根据已有的测试结果,它有更准确的错误提示,类型特征,用except*处理多个异常,零成本异常,改进类型(包括改进的类型、任意字符串文字类型、数据类转换、标准库中的TOML只读支持等)也得到了改进,这些也是开发者期待的新特性。Python如何“踩油门”?为什么Python给大家留下的印象是运行缓慢?通常有三种解释。第一种解释是Python是动态语言而不是静态语言。对于C等静态语言,编译器在声明时就知道变量的类型;对于Python来说,Python程序在执行时,编译器并不知道变量的类型,只知道它是一个对象。这意味着即使是简单的a+b这样的二元运算,由于变量a和b本身没有类型,但是它们的值有类型,Python执行起来非常“麻烦”:在“加”之前,你必须先确定类型。第二种解释是Python是一种解释型语言而不是编译型语言。C、C++、Rust等语言直接编译成机器码运行,属于编译型语言;Python的运行过程是虚拟机读取Python代码(文本),进行词法分析,编译成虚拟机可以识别的opcode,然后虚拟机解释opcode执行,最后一步“虚拟机解释操作码执行”是比较耗时的。第三种解释是它是全局解释器锁(GIL,GlobalInterpreterLock)的原因。现代计算机处理器一般都有多个内核,有些服务器甚至有多个处理器。因此,操作系统对Thread进行了抽象,可以在一个进程中产生多个Thread,让这些Thread同时运行在多个核心上,最大限度地提高处理器的效率。但是Python有自己的垃圾收集方案,选择的垃圾收集机制是引用计数+分代收集,引用计数是主要方式。在多线程的情况下,大家一起跑,多个线程一起操作引用计数。为了保证不会出现线程不安全的情况,多个线程在操作同一个对象时需要加锁。这就是GIL,但是这个锁的粒度太大了,整个Python解释器只能全局运行一个Thread。也就是说,不管你电脑的CPU有多少核,Python只用一个核。这三种解释都有一定的道理。理论上,Python提速可以从以上三个方向突破。根据Python团队最近的公告,Python3.11的性能改进主要集中在更快的启动和更快的运行时。这些优化大部分来自PEP659(一种自适应解释器),它的运行方式和JIT有点相似,都是识别热点代码,但是自适应解释器的工作范围离不开字节码。图片来源@documentscreenshot为什么3.11延迟发布从Pablo在邮件中公布的信息来看,Python3.11延迟发布主要是因为出现了很多“影响发布”的bug。图片来源@GitHubScreenshot虽然该bug的细节还有待进一步探究,但从目前的情况来看,问题可能出在以下两个方面。一个是C扩展的问题。CPython与C的简单接口是一个主要优势,而与C扩展的不兼容是一个主要缺点。CPython团队在CPython3.11所做的优化工作很大程度上忽略了扩展模块的问题。对此,团队负责人Shannon表示,团队正在开放将低级函数API暴露给虚拟机的可能性,以最大限度地减少Python代码和C代码的减少。二是上面反复提到的提速问题。Python创始人GuidovanRossum预计Python3.11版本将实现至少两倍的加速,但目前的Python3.11.0b3平均只比Python3.10快25%,与理想的目标。此外,Meta开发者SamGross在今年的Python语言峰会上向与会者介绍了nogil的情况。这是一个专注于移除GIL的项目。根据Python基金会的说法,Gross将发明一种新型锁。如果一切顺利的话,这个新锁很可能会出现在Python3.12版本中。虽然SamGross的提议让很多开发者兴奋不已,但它会与Python团队目前基于PEP659进行的优化工作产生冲突:毕竟CPython团队已经实现的优化有很大一部分是建立在GIL仍然存在的前提下的。如果SamGross的提议被采纳,在Python3.12中去掉GIL,那么Python3.11将不得不做很多改变。或许,这也是Python3.11延迟发布的一个重要原因。总之,考虑到Python在编程语言界的现状,以及Python3.11旨在克服它最大的缺点,Python的未来还是值得期待的。参考链接:https://mail.python.org/archives/list/python-dev@python.org/thread/3JWVCSBPBFWY5ZWSJ7RYB6FS5NIMCEOY/https://docs.python.org/zh-cn/3.11/whatsnew/3.11.html#faster-cpython
