Python 3.12重要改变总结:性能和效率提升


Python 3.12 是 Python 编程语言的最新版本,预计将对该语言带来重大优化和改进,重点是增强解释器的速度、性能和稳定性。这个新版本旨在使 Python 成为开发人员更强大、更高效的工具,特别是对于大型和复杂的应用程序。


改进的多线程并行性
通过从每个进程一个全局解释器锁过渡到每个子解释器一个全局解释器锁,Python正在采取措施改善多线程并行性。通过PEP 684和PEP 554,可以从Python中创建子解释器,从而实现真正的多线程并行。

扩展的专业性
开发团队已经评估了哪些字节码将从专业化中受益最多,并打算在3.12版本中完成剩余的高收益代码。

紧凑的对象结构
在3.12版本中,Python对象结构的大小将被缩小,从而改善整体内存的使用和缓存的一致性。在向后兼容性和性能之间做出一些妥协是必要的,这将导致一个PEP来达成共识。

降低内存管理
开销 对象的大小不仅会减少,而且其布局也会变得更加统一。这将为优化内存分配和释放提供机会,并在垃圾收集和取消分配时加快对象的遍历过程。

改良的跟踪优化器
Python 3.12版本的一个主要改进是跟踪优化器。与前一版本不同的是,前一版本的重点是用更快的、针对特定环境的操作码来替换单个操作码,现在的重点已经转移到优化多个操作码的序列上了。为了实现这一目标,许多高级别的操作码将被替换为低级别的操作码,以提供更大的优化可能性。此外,这些简化的操作码将使解释器更接近于一套可以转化为机器代码的指令,无论是在CPython中还是在第三方开发者的JIT项目中。

声明式解释器循环的生成
解释器循环将从声明性描述中生成,这将减少解释器循环与其他函数不同步而导致的bug的机会。此外,这一变化将使我们有可能对解释器循环的重大变化进行实验。

稳定的API
为了进一步提高CPython代码库的质量,开发团队正在采取以下行动。

简化编译器的维护和测试。
团队正在努力减少编译的不同阶段之间的依赖性,使之更容易维护和测试编译器。

加强代码覆盖率。
CPython测试套件在C语言层面将被监测和改进,以提高代码覆盖率。扩大Pyperformance套件。Pyperformance基准测试套件将被改进,以包括更多现实的、真实世界的工作负载。

协助解决与性能有关的问题。
该团队将为CPython问题和PR提供支持,特别是那些与性能有关的问题。

扩大标准基准测试结果。
标准基准测试机器和结果的集合将被扩大到包括macOS和Windows。

与主要的Python用户合作。
开发团队将与使用Python内部结构的主要项目合作,帮助他们适应CPython解释器的变化。

被删除和废弃的功能
随着Python 3.12的发布,distutils终于被移除。根据 PEP 632,distutils 在 Python 3.10 中被标记为废弃,在 Python 3.12 中将不再是标准库的一部分。从distutils中导入将导致一个错误,因为不会有向后兼容的情况出现。

Distutils 曾经是 Python 中软件包管理的首选模块,但它的局限性导致了 setuptools 的兴起,根据 Python 打包用户指南,它现在已经成为推荐的解决方案。Setuptools仍然使用distutils的一些功能,但它集成了后者的一个副本,不再依赖标准库。Pip 用 setuptools 替换 distutils 已经有一段时间了,所以在 Python 3.12 中删除传统的 distutils 模块是合理的。

此外,Python 3.12 还将从 Unicode 中删除 wstr 和 wstr_length 成员,正如 PEP 623 所指出的。这一变化与PEP 393中对某些Unicode API的废弃是一致的。移除这些成员后,在64位平台上,对象的大小减少了8或16字节。

改进了 Python 3.12 中的错误报告
最新版本的 Python 版本 3.12 将改进错误消息,特别是针对标准库中模块顶层引发的 NameError。解释器现在还将在错误消息中提供建议。

class A:
   def __init__(self):
       self.blech = 1

   def foo(self):
       somethin = blech

>>>
A().foo()
  File "<stdin>", line 1
    somethin = blech
               ^^^^^
NameError: name 'blech' is not defined. Did you mean: 'self.blech'?

Python 3.12中Unittest特性的废弃
作为 Python 3.12 发布的一部分,unittest 模块中的一些特性,以前在早期版本 (主要是 v3.1 和 3.2) 中被废弃,现在将被删除。删除的内容包括

  • Many TestCase method aliases, such as failUnless, failIf, failUnlessEqual, failIfEqual, failUnlessAlmostEqual, failIfAlmostEqual, failUnlessRaises, assert_, assertEquals, assertNotEquals, assertAlmostEquals, assertNotAlmostEquals, assertRegexpMatches, assertRaisesRegexp, and assertNotRegexpMatches
  • The TestCase method assertDictContainsSubset
  • The use_load_tests parameter in TestLoader.loadTestsFromModule
  • The _TextTestResult alias of TextTestResult

语言的其他增强和补充
虽然不可能分享 Python 3.12 中的所有修改,但这里简要概述了一些额外的改进和更改:

  • 标准库os模块中os.path.isjunction()的引入,允许用户检查路径是否为junction
  • 用于遍历目录树的新 pathlib.Path.walk() 方法,类似于 os.walk()
  • 删除了以前 Python 版本中弃用的几个模块和 API

有关 Python 3.12 发布计划的所有更改的完整列表,请参阅官方文档。
https://docs.python.org/3.12/whatsnew/3.12.html

结论
Python 3.12 版本包括对该语言的多项改进和更改。distutils 模块已被标记为已弃用,并将在 Python 3.12 版本中删除。相反,推荐的包管理模块是 setuptools。此外,wstr 和 wstr_length 成员将从 Unicode 中删除。
错误消息也将得到改进,特别是标准库模块顶层的 NameErrors。unittest 模块将删除几个不推荐使用的功能,包括方法别名和参数。
其他更改包括引入 os.path.isjunction() 成员来检查连接路径和 pathlib.Path.walk() 方法来遍历目录树。先前在早期版本中弃用的几个模块和 API 也将被删除。