Python 是一种深受喜爱的编程语言,以其简单性和多功能性而闻名,近年来在解决其速度限制方面取得了显着进步。核心 Python 团队的开发人员一直在努力工作,专注于优化性能和提高效率。在这里,我们将深入探讨将 Python 转变为更快、更高效的语言的激动人心的举措,特别强调 3.11 之后的改进。统上,Python 的动态特性在速度方面带来了挑战。然而,核心 Python 团队近年来在解决内存使用、解释器性能和编译器优化方面取得了重大进展。这些努力最终在 Python 3.12 中达到顶峰,它展示了许多新的和改进的增强功能,从而大大提高了整体性能。
Python 中的多线程受到全局解释器锁 (GIL) 的阻碍,从而阻止了真正的并行性。然而,一种称为子解释器的突破性解决方案已经出现,彻底改变了 Python 的并发模型。子解释器允许多个解释器在单个进程中同时运行,每个解释器都有自己的 GIL。这项创新使 Python 能够更有效地利用多个内核,提供增强的并发性,而不受传统线程或多处理的限制。
在 Python 3.11 中引入的自适应指令功能改变了字节码解释器。这种强大的机制在运行时自动将字节码替换为针对特定 Python 类型量身定制的专用版本,这一过程称为加速。Python 3.12 在此基础上构建,引入了额外的操作码增强功能并简化了专业化。因此,执行速度显著加快,可在各种场景中实现性能提升。
从历史上看,Python 对象会消耗大量内存,从而影响性能。然而,最近的工作集中在简化对象设计上,以实现更有效的内存利用率。在 Python 3.12 中,通过将对象标头大小从 208 字节减少到仅 96 字节,实现了重大突破。这种减少不仅允许在内存中存储更多对象,而且还增强了缓存局部性,有助于提高整体性能。
在其三十年的历史中,Python 的默认实现 CPython 积累了遗留的 API 和设计的复杂性。为了确保长期可维护性并促进未来的改进,核心 Python 团队已经开始了清理和现代化 Python 内部的旅程。努力包括减少对 C API 的依赖,方法是将其设为私有,并将其从内部实现细节中抽象出来。像 HPy 这样有前途的第三方项目提供了稳定和优化的替代方案,减轻了维护负担并释放了额外的性能优势。
改进的多线程并行性
Python 通过为每个子解释器引入全局解释器锁,在改进多线程并行性方面取得了长足的进步,如 PEP 684 和 PEP 554 中所述。这实现了真正的多线程并行性,为开发人员开辟了新的可能性。
扩展专业化
开发团队已经确定了可以从专业化中受益的字节码,并正在积极致力于完成 Python 3.12 的高优先级字节码。这些专门的优化将进一步提高 Python 代码的性能。
紧凑对象结构
在 Python 3.12 中,Python 对象结构的大小将减小,从而提高内存使用率和缓存一致性。虽然在向后兼容性和性能之间做出一些妥协是必要的,但这些变化将以 PEP 中概述的建立共识过程为指导。
降低内存管理开销
在 Python 3.12 中,不仅对象的大小会减小,而且它们的布局也会变得更加统一。这将优化内存分配和释放过程,使其更加高效。垃圾回收和对象遍历将更快,从而全面改进内存管理。
改进的跟踪优化器
Python 3.12 的一个主要亮点是跟踪优化器,它专注于优化多个操作码的序列,而不是单个操作码。这种优化是通过用低级操作码替换高级操作码来实现的,这些操作码提供了更大的优化可能性。这些变化使 Python 更接近于一组可以转换为机器代码的指令,使 CPython 和第三方 JIT 项目都受益。
声明式解释器循环生成
Python 3.12 引入了用于生成解释器循环的声明性描述。此更改降低了由于解释器循环与其他函数之间的不一致而导致错误的可能性。它还允许对解释器循环进行重大更改的试验,从而实现进一步的优化。
稳定的 API 和质量增强
为了提高 CPython 代码库的质量,开发团队正在采取多项行动。他们正在简化编译器的维护和测试,通过 CPython 测试套件提高代码覆盖率,扩展 pyperformance 基准测试套件,为与性能相关的问题提供支持,并与主要 Python 用户合作以适应 CPython 解释器的变化。
已删除和弃用的功能
Python 3.12 告别了 distutils 模块,该模块在 Python 3.10 中被标记为已弃用,现已删除。推荐的替代品是 setuptools,它集成了 distutils 的必要功能。此外,wstr 和 wstr_length 成员已从 Unicode 对象中删除,从而减小了对象大小。
改进的错误报告
Python 3.12 提供了改进的错误消息,特别是针对标准库中模块的顶层引发的 NameError。解释器现在在错误消息中提供建议,帮助开发人员快速识别和解决问题。
弃用 Unittest 功能
在早期版本中已弃用的 unittest 模块中的几个功能将在 Python 3.12 中删除。其中包括方法别名、断言方法、assertDictContainsSubset 和 TestLoader 中的某些参数。