5月中旬刚刚结束的Pycon US 2021上,Python之父Guido van Rossum提出要在未来四年内将CPython速度提升5倍。
而这一“Shannon计划”的参与者除了Guido本人之外,还有任职微软的CPython核心开发人员Eric Snow,以及Semmle的研究工程师Mark Shannon。
但在此之前,Guido可并不认为提升CPython的速度有多关键,因为“有其他方法可以获得更好的性能”,比如JIT编译的PyPy,或使用C语言编写扩展。
为什么要加速?
Python真的慢吗?
不见得,开发效率和执行速度本就难以兼得。
而且发展到今天,Python已经是一个胶水语言的定位,主要用来快速构建系统的逻辑控制流,再把对性能要求高的部分丢给C/C++来实现。
不过如果只看标准版的语言实现本身的话……它的性能确实不怎么样。
动态语言的特性决定了Python会在C语言代码运行(runtime)上花费大量的时间,且难以使用JIT(Just-In-Time)进行优化。
在接受英国技术新闻网站The Register的采访时,对于“为什么开始关注CPython性能?”的问题,Shannon表示:
过去几年里,Python在机器学习领域的使用率大大提升,可用资源也越来越多。这意味着我们可以不用担心破坏其可靠性,而是专注在性能上。
并且,Shannon之前参与的HotPy项目中所开发的解释器,比目前CPython解释器的纯Python代码快三倍。这证明了对CPython优化的可行性。
而在去年10月份的时候,耐不住退休寂寞的Guido又加入了微软:
再加上疫情的家里蹲buff,拥有了更多时间的大佬们一拍即合,决定Make Python Great Again。
加速之前的挑战
Shannon坦言,向下兼容是加速Python的最大挑战。
其实不仅是对Python,90年代末libc的那次不兼容更新,直接导致所有应用程序都要重编……
而现在已经凉凉的Pyston,官方文章里提到的Dropbox放弃Pyston项目的几大因素中,第一个也是:
这就是所有既试图兼容CPython,又想大幅提升性能的Python都会遇到的严峻问题。
因为Python的执行类似于HTML渲染:更多是对运行时应如何执行C库的描述,而非单步执行命令。
所以,Python性能提升的源头来自于这些C扩展模块。而CPython又有着超过400k的loc,这意味着要从底层去做优化是一项非常庞大的工程。
特别是对于过于动态的Python语言来说,语言的语义对优化的影响就更大了。
而现在加速的过程中,像是CPython的工具、调试器、配置文件,NumPy包,以及Cython这样的编译器,又会有多少涉及到CPython内部和底层的行为?
因此Shannon表示:
要改变是困难的……与CPython用户间的隐形协议并没有很好地定义什么能改,什么不能改。
可能是五年前从Python2.x迁移到3的痛苦经历实在是有些刻骨铭心,Guido专门发推表示这次的迁移会更加平和。
而他也在Python峰会中承诺:不破坏stable ABI兼容性;不破坏limited API兼容性;不破坏或减缓extreme cases。
“总之,代码的可维护性才是第一要务。”
Python的5倍速之路
按照已在GitHub上发布的faster-cpython,Shannon计划具体分为四个阶段:
Python 3.10
预计在今年10月发布,主要添加一个自适应、专业化的解释器(interpreter)。
解释器将不再遇运行时生成代码,而是利用程序中的类型稳定性,在执行过程中适应类型和数值。
Python 3.11
Guido提出要在3.11版本实现至少2倍的提速,为此,他已经和几位Python开发人员提出了一份增强功能的提案PEP 659。
这一提案中表示要增加适应性的字节码解释器,并且实施更有效的异常处理。
除此之外,还提出了优化帧堆栈、改变函数调用的方式、增加优化以加快启动时间,以及修改 .pyc 字节码缓存文件格式等工作。
Python 3.12
这一阶段使用针对小区域的JIT解释器,在运行代码时简单、快速地对小区域的专门代码进行编译。
Python 3.13
同样在代码运行时对扩展区域进行编译,增强编译器,以完成5倍的超级加速。
Guido表示此次围绕性能展开的 Python 变更,将主要服务于运行CPU密集型纯Python代码的开发者,以及内置Python网站的用户。
而在C语言代码(如 NumPy和TensorFlow)、I/O 绑定代码、多线程代码以及算法代码上,提升效果将会比较有限。
微软回馈Python
其实,微软长期以来一直以多种方式为Python项目提供助力,包括在Azure云AI服务教程里发布免费的Python课程,以及通过VS Code Python扩展在Win10及以上版本支持Python。
自 2006 年起,微软还成为了Python软件基金会(PSF)的赞助商,并在今年出资15 万美元进行资助。
目前已有五位Python开发者社区的核心人员在微软任职,包括去年年底加入的Python之父,和这次Shannon计划里的三人之一Eric Snow。
Guido也在这次峰会里特地cue了一下微软,提出微软资助了一支小型Python团队“负责语言解释层面的性能改进工作”,以使他能携手微软同事持续对Python进行开发。
当然,对于3.11版本的短期目标,Guido还是在ppt中给自己兜了个底。
△“乐观一点,好奇一点总没错”
而对于那个四年五倍速的最终目标,Guido则表示“我们必须保持旺盛的创造力。”