Python 3.15 测试版发布,亮点抢先看
Python 3.15 的首个完整测试版已经推出,这可是许久以来功能最为丰富的 Python 版本之一。现在,让我们一起看看其中那些重大、大胆且重要的创新、改进与修复。
延迟导入:轻松延迟成本
延迟导入是一项备受期待的功能,它允许程序仅在实际使用模块时才处理导入操作。对于那些导入速度慢、会大幅增加程序启动时间的模块,现在可以轻松地将这一成本延迟到模块代码实际执行时。可以使用新的延迟导入语法显式地进行延迟导入,也能通过编程方式或使用环境变量,让采用传统导入方式的代码实现延迟导入效果。这使得无需大量重写现有代码,就能利用这一功能。最重要的是,延迟导入没有任何弊端,其行为与正常导入完全一致。
内置 frozendict 类型:新增不可变字典
Python 很少会新增数据类型,而这次新增的不可变字典(frozendict)可是经过长时间讨论且备受期待的。frozendict 的行为与普通字典类似,但它是不可变的(不能添加、删除或更改元素),并且可哈希(例如,可以将其用作另一个字典的键)。
内置 sentinel() 类型:取代常见模式
这门语言的另一个新特性旨在取代一种常见且存在问题的 Python 模式:使用 `object()` 创建唯一的哨兵对象(例如,在 `None` 可能是有效值的情况下作为 `None` 的替代)。新的语法 `sentinel("NAME")` 可以创建唯一的对象,这些对象只能通过 `is` 运算符与自身进行比较。这些对象能够进行正确的类型检查,并且有清晰的表示,而不只是一个随机的对象描述符。
统计采样分析器:新增分析模块
长期存在的 `cProfile` 模块采用确定性方式对 Python 代码进行分析,即跟踪并记录每一次调用。这虽然精确,但也意味着使用 `cProfile` 跟踪的程序运行速度会比正常情况慢得多。Python 3.15 新增的 `profiling.sampling` 分析模块采用统计采样方法,在对程序速度影响极小的情况下,收集有关性能的有用信息。现有的 `cProfile` 分析器仍然可用,只是有了一个新的别名 `profiling.tracing`。
升级后的 JIT:性能提升 8% - 13%
CPython 内置的即时编译(JIT)器在 Python 3.13 中首次亮相。其长期目标是在不改变代码的情况下,让 Python 程序运行得更快,就像替代 Python 运行时环境 PyPy 那样。而且使用它无需更换为有一定局限性的完全不同的解释器。最初几个版本的 JIT 并没有带来显著的速度提升,主要是为未来的改进奠定基础。而在 Python 3.15 中,根据不同的平台和工作负载,JIT 相较于标准 CPython 的几何平均性能提升了 8% 至 13%。主要的改进包括:新的跟踪前端(以便在更多类型的代码上实现加速)、使用寄存器分配以提高运行速度和内存使用效率、JIT 生成更好的机器代码,以及进行额外的优化,如消除某些对象类的引用计数。
更出色的错误信息:延续精确实用趋势
在过去几个版本中,Python 的错误信息变得更加精确、详细且实用,Python 3.15 延续了这一趋势。主要亮点如下:对于缺失名称的提示(如 “x 没有属性 ‘y’。你是不是想输入 ‘xyz’?”)现在不仅会参考对象本身,还会考虑给定对象的成员。提示范围现在还涵盖了删除属性的检查,而不仅仅是访问属性。如果解释器无法通过 Levenshtein 距离进行模糊名称匹配来为某个方法提供建议,它会参考其他语言中此类方法常用的名称列表。例如,如果你尝试使用 `list.push()`(JavaScript 方法),解释器会建议使用 `.append()`,这是 Python 列表的正确方法。
类型系统改进:支持新参数
`TypedDict` 类允许你创建具有预定义键以及带类型提示的键和值的字典,其定义中新增了对两个新参数的支持。`closed` 参数让你可以指定在运行时是否只能使用指定的键。`extra_items` 参数允许你在运行时指定额外的键,但这些键的值必须是指定类型。`TypeForm` 类型定义可以表示计算类型表达式的结果值。有了它,类型注解可以在类型本身被用作值的地方使用,例如在 `typing.cast` 甚至 `isinstance` 等操作的变体中,或者作为第三方类型检查工具工作方式的一部分。
推导式中的解包:少写一步代码
这是另一个长期以来被期待的功能。过去,如果你想使用推导式完全解包或“展平”嵌套对象,你需要使用 `itertools.chain()` 这样的函数,或者编写语法复杂的嵌套推导式。现在,在推导式中使用星号运算符进行解包可以让你少写一步。使用 `**` 进行解包同样可行,例如可以用来展平和合并字典。最后,这种解包方式还可以用于创建生成器表达式。
恢复分代垃圾回收器:解决内存使用问题
Python 3.15 做出了一个重要的转变。Python 3.14 对其垃圾回收系统进行了重大更改,引入了增量垃圾回收器,旨在减少收集垃圾时程序的停顿时间。然而,许多用户反馈新的垃圾回收器会增加进程内存使用量,有时甚至会大幅增加。Python 3.15 将恢复使用 Python 3.13 及更早版本采用的分代垃圾回收器。增量垃圾回收器可能会在未来版本中回归,但在此之前,需要对其进行额外改进以避免该问题再次出现。 这些新特性会给 Python 的使用带来怎样的改变呢?