21CTO 导读:Python 3.15 的候选版本已经发布,其亮点包括惰性导入、更快的 JIT 编译、更完善的错误信息和更智能的性能分析。
Python 3.15即将发布。在这次的候选版本3.15.0rc2更新中,有趣的变化不再体现在阅读更新日志时候了。
该版本的最大变化优化了开发者每周都会遇到的问题:应用程序启动缓慢、不可变配置很麻烦、性能分析开销、编码差异、自由线程 Python、重复的推导式代码以及调试令人沮丧的错误。
我们从早期预览版到发布候选版一直关注着 3.15 的开发周期,其模式很明确:Python 3.15 与其说是一个重磅功能,不如说是让日常 Python 开发更加顺畅。
Python 3.15 的最终版本计划将于2026 年 10 月 1 日发布。
因此,与其逐一介绍每一个细微的变化,不如直接来看看开发者真正应该关注的 7 个 Python 3.15 新特性和变化,以及它们对实际项目的意义。
Python 3.15 最重要的变化包括不限于如下新功能:
frozendictsentinelPython 官方 3.15 文档目前将这些列为 Python 3.14 的主要变化之一。
让我们来看看哪些功能可能会真正改变我们编写或维护 Python 代码的方式。
这可能是人们对 Python 3.15 中命令行应用程序最感兴趣的变化。
延迟导入是一项用户期待已久的功能,它允许仅在程序实际使用导入的模块时才执行导入操作。对于那些导入速度慢、会显著增加程序启动时间的模块,你可以将这种开销延迟到该模块代码实际执行时再进行。
开发者可以使用新的惰性导入语法显式地使用惰性导入,也可以通过编程方式或使用环境变量强制使用传统导入的代码以惰性方式运行。这使得现有代码无需大量重写即可轻松利用此功能。
最重要的是,惰性导入没有任何缺点:它们的行为与预期完全一致。
Python 的立即导入模块:
import pandasimport torchimport expensive_packageprint("Application started")
Python 很少添加新的数据类型,但这次添加是一个经过长期讨论和用户期待的数据类型 :frozendict(冻结字典)。
frozendict的行为与普通字典类似,只是它是不可变的(也就是说你不能添加、删除或更改元素),而且它是可哈希的(可以将其用作另一个字典的键)。语言的另一项新增功能旨在取代 Python 中一个常见且存在问题的模式:使用 `is` 来创建唯一的哨兵对象(例如,作为None`is`可能为有效值的替代方案) 。新的语法 ` is` 会创建仅与自身进行比较的唯一对象(通过 ` is` 运算符)。
这些对象可以进行正确的类型检查,并且具有信息丰富的表示形式,而不仅仅是一个随机的对象描述符。
假设你正在创建一个用于更新用户的函数,如下代码所示:
def update_user(name =None):if name isNone:...
一旦进入该代码块内部if,就会出现问题。是nameNone因为用户没有提供值,还是因为用户显式地传递了值None。
实际上,update_user()与update_user(name=None)这两个函数几乎无法区分。
当有了isNone,就可以参考编写如下代码:
MISSING = object()def update_user(name = MISSING):if name is MISSING:print("No name was provided")elifname isNone:print("Name was explicitly set to None")else:print(f"New name:{name}")
CPython 内置的即时 (JIT) 编译器在 Python 3.13 中首次亮相。它的长期目标是在不修改代码的情况下提升 Python 程序的运行速度,这与PyPy这种替代 Python 运行时库的加速方式类似。而且,它无需像其他解释器那样,因为 PyPy 本身也存在一些限制。
JIT 的前几个版本并没有承诺或实际带来显著的速度提升,它们更多的是为了未来的改进奠定基础。
伴随着 Python 3.15 的发布,JIT 的性能几何平均值相比标准 CPython 提升了 8% 到 13%,具体提升幅度取决于平台和工作负载。
最大的变化包括:全新的跟踪前端(使更多类型的代码能够获得更高的速度提升)、使用寄存器分配实现更快、更高效的内存利用、JIT 生成的更优质的机器代码,以及其他优化,例如消除某些对象类的引用计数。
值得尝试对工作负载启用 JIT,看看是否能感受到任何可衡量的性能差异。
但请注意,JIT 的进一步开发现在受到一些明确的指导原则的约束,这些原则规定了 JIT 需要提供的性能提升,只有达到这些提升,它才能被视为 Python 的正式支持组件,而不仅仅是一个实验性的附加功能。
在过去的几个版本中,Python 的错误信息正变得更加精确、详细和实用,Python 3.15 也延续了这一改进。主要亮点如下:
现在,对于缺失的名称(“x没有属性‘ y’。你是不是想找‘ xyz’?”)的建议,不仅包括对象本身提供的建议,还包括给定对象的成员提供的建议。
现在的建议还包括检查是否删除属性,而不仅仅是访问属性。它会参考其他语言中常用的方法名称列表。例如,如果你尝试使用 List list.push()(一个 JavaScript 方法),解释器会建议使用.append()List,这是 Python 列表的正确方法。
类型系统改进TypedDict类,允许你创建具有预定义键和类型提示键值对的字典,并在其定义中新增了两个参数。
第一个closed参数允许你指定运行时是否仅使用指定的键。第二个extra_items参数允许你在运行时指定额外的键,但这些键的值必须是指定类型。
类型TypeForm定义允许你表示类型表达式求值后的结果值。这样,类型注解就可以用于类型本身被用作值的地方——例如,诸如 iftyping.cast或 if 之类的操作的变体isinstance,或者作为第三方类型检查工具工作方式的一部分。
回滚增量垃圾回收器
下面是Python 3.15 迎来的一个重要的转折。
Python 3.14 对其垃圾回收系统进行了重大改进——引入了增量式垃圾回收器,旨在减少程序因垃圾回收而停止运行的时间。但是,许多用户反映,新的垃圾回收器增加了进程内存使用量,有时甚至大幅增加。
Python 3.15 将恢复使用 Python 3.13 及更早版本中使用的分代式垃圾回收器。增量式垃圾回收器可能会在未来的版本中回归,但前提是必须对其进行进一步的改进,以避免该问题再次出现。
其他的变化
还有一个新的数学模块,math.integer为你提供整数特定数学运算的函数,例如最大公约数或整数平方根。稳定版 ABI的创建是为了简化 CPython 扩展的编写,使其无需重新编译即可兼容 Python 的多个版本。
从 Python 3.15 开始,可使用自由线程(也称为“无 GIL”)。Python 构建的扩展的开发者现在可以使用稳定版 ABI。但这需要对使用稳定版 ABI 的扩展进行一些重写;仅仅通过更改头文件重新编译代码是无法实现的。
现在在支持的 CPython 版本中,帧指针默认启用。这使得堆栈展开更加便捷快速,从而使系统级性能分析和调试工具能够更可靠地分析 CPython。
此外,UTF-8 现在是 Python 的全局默认编码。例如,在读取文件文本时,你不用再需要指定 UTF-8 编码,可以使用命令行标志或环境变量禁用此行为。
结语
Python 3.15计划于 2026 年 10 月 1 日正式发布。伴随着发布日期的临近,我们特别提前盘点了新版本的新功能。
作者:场长
参考:
https://peps.python.org/pep-0790/
本篇文章为 @ 万能的大雄 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 微信公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。
请扫描二维码,使用微信支付哦。