python3.12中的新特性(二)

Python 3.12刚发布不久。官方鼓励开发人员在非生产代码中尝试这个最新版本,既可以验证它与你的程序的兼容性,也可以了解你的代码是否能从这个最新版本中的新功能集和性能改进中受益。以下是Python 3.12中最重要的新功能以及它们对开发人员的意义的简要介绍。

Python每年发布一个新版本,其中包括在上半年发布功能锁定的测试版,在年底发布最终版本。

目录

更好的错误消息
减少f-string的格式限制
对Linux perf性能分析器的支持
更快的调试/性能监控
缓冲协议dunders

类型提示改进
性能改进
其他变更

类型提示(Typing)改进

Python 3.5引入的类型提示语法允许linting工具提前捕获各种错误。随着后续版本的发布,Python中的类型提示功能不断增加,涵盖了更广泛和更细粒度的用例。

TypedDict

在Python 3.12中,您可以使用TypedDict作为函数中用于提示关键字参数类型的类型来源。在3.11版本中引入了Unpack可变泛型来实现这一功能。以下是相关PEP中的示例:

class Movie(TypedDict):
    name: str
    year: int

def foo(**kwargs: Unpack[Movie]) -> None: ...

在这个例子中,foo可以接受与Movie的内容匹配的名称和类型的关键字参数,即name:str和year:int。这在类型提示接受没有默认值的可选关键字参数的函数时非常有用。

类型参数语法

类型参数语法提供了一种更清晰的方式来指定泛型类、函数或类型别名中的类型。以下是从PEP中摘取的一个例子:

# 旧的方法
from typing import TypeVar

_T = TypeVar("_T")

def func(a: _T, b: _T) -> _T:
    ...

# 新的类型参数方法
def func[T](a: T, b: T) -> T:
    ...

使用新的方法,无需导入TypeVar。只需使用func[T]语法来指示泛型类型引用。还可以指定类型边界,例如给定类型是否属于一组类型,尽管这些类型本身不能是泛型。一个例子是func[T: (str,int)]。

最后,新的@override装饰器可以用于标记覆盖父类方法的方法,以确保在重构(重命名或删除)父类时,其子类也会反映出所做的更改。

性能改进

随着Python 3.11的推出,许多相关项目开始着手改进Python的性能,每个新版本都取得了飞跃式的进展。Python 3.12中的性能改进虽然不像之前那样引人注目,但仍值得关注。

内联 Comprehension

Comprehension是一种语法,可以快速构建列表、字典和集合,现在它们是通过”内联”方式构建,而不是通过临时对象。对于这一改进的速度提升,在实际案例中约为11%,在微基准测试中甚至可以提速两倍。

Immortal 对象

Python中的每个对象都有一个引用计数,用于跟踪其他对象引用它的次数,包括None等内置对象。PEP 683允许将对象视为”immortal”,因此它们的引用计数永远不会改变。

长期来看,使对象成为immortal对象对Python有很大的影响。它使得python可以更容易的实现多核扩展,并且可以实现其他优化(如避免写时复制),而这些优化在以前很难实现。

更小的对象大小

在早期版本的Python中,对象的基本大小为208字节。在过去几个Python版本中,对象进行了多次重构,使其更小,这不仅使的内存中可以存储更多对象,还有助于提高缓存的局部性。从Python 3.12开始,对象为96字节,不到以前的一半。

子解释器

一个期待已久的功能–子解释器,即在单个Python进程中同时运行具有独立GIL的多个解释器实例。这将是Python更好并行性的重要一步。

然而,版本3.12只只包含了使这个成为可能的CPython。目前还没有面向最终用户的子解释器接口。标准库模块interpreters旨在实现这一点,但现在计划在Python 3.13中出现。

其他变更

除了上述讨论的重大变更之外,Python 3.12还推出了一些小的变更。以下是一个快速查看。

Unstable API

一个重要的持续项目是对CPython内部的重构,特别是其API集,以减少需要暴露的底层函数的数量。Python 3.12引入了Unstable API层,这个API集在版本之间可能发生变化。也不打算被大多数C扩展使用,而是由诸如调试器或JIT编译器等底层工具使用。

弃用和移除的标准库

在3.11版本中,许多已被认为过时的标准库模块(所谓的dead batteries)被标记为在Python 3.12和3.13中移除。在此版本中最大的移除是distutils,它早已被setuptools取代。此版本中还删除的其他模块包括asynchat、asyncore(都被asyncio取代)和smtpd。

垃圾回收

Python的垃圾回收机制(GC)过去可以在分配对象时运行。从Python 3.12开始,GC仅在Python字节码循环中的”eval breaker”机制之间运行,也就是在执行一个字节码和另一个字节码之间。它还在调用CPython的信号处理程序检查机制时运行。这使得在运行时之外的长时间运行的C扩展调用上定期运行GC成为可能。


原文始发于微信公众号(harvey的网络日志):python3.12中的新特性(二)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/188250.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!