17611538698
info@21cto.com

Python 3.15 中的最佳与最新特性

图片

导读:Python 3.15 的新亮点。在刚刚推出的 beta 版中,包括延迟导入、更快的 JIT 编译、更好的错误消息和更智能的性能分析。

Python 3.15 的首个完整测试版已经发布,这是近年来功能最丰富的 Python 版本之一。

以下,是对其中最大、最重要、最令人瞩目的创新、变更以及修复的描述。

延迟导入


延迟导入是一项开发者期待已久的功能,它允许仅在程序实际使用导入的模块时才执行导入操作。因此,对于那些导入速度慢、会显著增加程序启动时间的模块,现在您可以轻松地将这种开销延迟到该模块代码实际执行时。

你可以使用新的惰性导入语法显式地使用惰性导入,也可以通过编程方式或使用环境变量强制使用传统导入的代码以惰性方式运行。这使得现有代码无需大量重写即可轻松利用此功能。最重要的是,惰性导入没有任何缺点:它们的行为与预期完全一致。

内置类型frozendict


Python 很少添加新的数据类型,但这次的添加却是一个经过长期讨论和期待的:冻结字典。它的frozendict行为与普通字典类似,只是它是不可变的(不能添加、删除或更改元素),而且它是可哈希的(因此你可以将其用作另一个字典的键)。

内置的 sentinel() 类型


Python语言的另一项新增功能旨在取代 Python 中一个常见且存在问题的模式:使用 `is` 来创建唯一的哨兵对象(例如,作为None`is`可能为有效值的替代方案) 

新的语法 ` is` 会创建仅与自身进行比较的唯一对象(通过 ` is` 运算符)。这些对象可以进行正确的类型检查,并且具有信息丰富的表示形式,而不仅仅是一个随机的对象描述符。Noneobject()sentinel("NAME")is

统计抽样分析器


长期以来,cProfile`profile` 模块以确定性的方式分析 Python 代码——也就是说,它会跟踪并记录每一次函数调用。

这使得分析结果非常精确,但也意味着被 ` cProfileprofile` 跟踪的程序运行速度会比正常情况慢得多。

Python 3.15 中新增的 `profile` 模块profiling.sampling使用统计抽样方法,以极小的程序运行速度影响来获取有用的性能信息。现有的cProfile`profile` 模块仍然可用——它不会被移除——只是有了一个新的别名 `profile` profiling.tracing

升级版JIT


CPython 内置的即时 (JIT) 编译器在 Python 3.13 中首次亮相。

它的长期目标是在不修改代码的情况下提升 Python 程序的运行速度,这与PyPy这种替代 Python 运行时库的加速方式类似。而且,它无需像其他解释器那样,因为 PyPy 本身也存在一些限制。

JIT 的前几个版本并没有承诺或实际带来显著的速度提升,因为它们更多的是为了未来的改进奠定基础。

伴随着 Python 3.15 的发布,JIT 的性能几何平均值相比标准 CPython 提升了 8% 到 13%,具体提升幅度取决于平台和工作负载。最大的变化包括:全新的跟踪前端(使更多类型的代码能够获得更高的速度提升)、使用寄存器分配实现更快、更高效的内存利用、JIT 生成的更优质的机器代码,以及其他优化,例如消除某些对象类的引用计数。

更加清晰的错误信息


在过去的几个版本中,Python 的错误信息变得更加精确、详细和实用,Python 3.15 也延续了这一改进。主要亮点如下:

  • 现在,对于缺失的名称(“x没有属性‘ y’。您是不是想找‘ xyz’?”)的建议,不仅包括对象本身提供的建议,还包括给定对象的成员提供的建议。
  • 现在的建议还包括检查是否删除属性,而不仅仅是访问属性。
  • 如果解释器无法通过基于莱文斯坦距离的模糊名称匹配找到合适的方法建议,它会参考其他语言中常用的方法名称列表。例如,如果您尝试使用 `Listlist.push()(一个 JavaScript 方法),解释器会建议使用.append()`List`,这是 Python 列表的正确方法。


类型系统改进


TypedDict允许开发者创建具有预定义键和类型提示键值对的字典,并在其定义中新增了两个参数。其中,第一个closed参数允许你指定运行时是否使用指定的键。第二个extra_items参数允许你在运行时指定额外的键,但这些键的值需要明确指定类型。

类型TypeForm定义允许你表示类型表达式求值后的结果值。这样,类型注解就可以用于类型本身被用作值的地方——例如,诸如 `if`typing.cast或 `if` 之类的操作的变体isinstance,或者作为第三方类型检查工具工作方式的一部分。

阅读理解中的拆解


这是另一个用户期待已久的功能。过去,如果你想使用列表推导式完全展开或“扁平化”一个嵌套对象,你需要一个类似这样的函数itertools.chain(),或者你必须编写一个语法丑陋的嵌套列表推导式:

x = [[1,2,3],[4,5],[6]] y = [a for b in x for a in b]>>> [ 1 , 2 , 3 , 4 , 5 , 6 ] # y

在阅读理解中使用星号运算符进行展开可以省去一个步骤:

x = [[1,2,3],[4,5],[6]] y = [*a for a in x]>>> [ 1 , 2 , 3 , 4 , 5 , 6 ] # y

解包**也有效,例如可以用来扁平化和合并字典:

dicts = [{ 'a' : 1 }, { 'b' : 2 }, { 'a' : 3 }]y = {**d for d in dicts} >>> { 'a' : 3 , 'b' : 2 }

最后,这种解包方法还可以用于构建生成器表达式:

(*x for x in "ab" , "cd" , "ef" ]

上面的表达式创建了一个生成器,其结果为:

'a' , 'b' , 'c' , 'd' , 'e' , 'f' ]

回滚增量垃圾回收器


最后,Python 3.15 迎来了一个重要的转折。

Python 3.14 对其垃圾回收系统进行了重大改进——引入了增量式垃圾回收器,旨在减少程序因垃圾回收而停止运行的时间。但是,不少用户反映,新的垃圾回收器增加了进程内存使用量,有时甚至大幅增加。

Python 3.15 将恢复使用 Python 3.13 及更早版本中使用的分代式垃圾回收器。增量式垃圾回收器可能会在未来的版本中回归,但前提是必须对其进行进一步的改进,以避免该问题再次出现。

作者:手扶拖拉斯基

评论

我要赞赏作者

请扫描二维码,使用微信支付哦。

分享到微信