Python官方在10月7日正式发布3.13.0版本,为开发者们带来更加强大的Python功能和特性。Python3.13拥有更好的交互式解释器美,删除了许多在3.11版本之前被弃用的函数,优化了编译运行性能,大幅提供语言效率,新增和改进了许多模块。感兴趣的朋友快来下载最新版的Python 3.13体验吧。
Python安装步骤
1、下载安装程序并打开,点击自定义安装(Customize installation)
2、勾选如图所示的选项,点击next
3、勾选如图所示的选项,点击install
4、等待安装
5、安装完成
发布重点
错误消息继续得到改进,回溯信息现在默认使用彩色高亮显示。 locals() 内置函数现在对于修改所返回的映射具有 更细化的语法,并且类型形参现在支持设置默认值。
针对标准库的改变包括移除已弃用的 API 和模块,以及用户友好度和正确性方面的常规提升。 一些旧式标准库模块自 Python 3.11 起被弃用 (PEP 594) 之后现在 已被移除。
本文并不试图提供所有新特性的完整规范说明,而是提供一个方便的概览。 要了解完整细节请参阅相应文档,如 标准库参数 和 语言参考。 要了解某项改变的完整实现和设计理念,请参阅相应新特性的 PEP;但请注意一旦某项特性已完全实现则相应 PEP 通常不会再继续更新。 请参阅 迁移到 Python 3.13 了解如何从较早 Python 进行升级的指导。
解释器的改进:
大幅改进的 交互式解释器 和 改进的错误消息。
PEP 667: 现在 locals() 内置函数在修改被返回的映射时具有 已定义语义。 Python 调试器及类似的工具现在即使在并发代码执行期间也能更可靠地在已优化的作用域中更新局部变量。
PEP 703: CPython 3.13 具有对在运行时禁用 global interpreter lock 的实验性支持。 请参阅 自由线程 CPython 了解详情。
PEP 744: 增加了一个基本的 JIT 编译器。 目前默认是禁用的(但以后可能启用)。 能够小幅提升性能 -- 我们预计在接下来的几个发布版中不断改进它。
在新的 交互式解释器 中,以及 回溯信息 和 文档测试 输出中的颜色支持。 这可以通过 PYTHON_COLORS and NO_COLOR 环境变量来禁用。
对 Python 数据模型的改进:
__static_attributes__ 保存了可在一个类体的任何函数中通过 self.X 来访问的属性名称。
__firstlineno__ 记录了一个类定义的首行的行号。
标准库中的重大改进:
新增了 PythonFinalizationError 异常,当操作在 最终化 期间被阻塞时将被引发。
现在 argparse 模块可支持弃用命令行选项、位置参数和子命令。
新增的函数 base64.z85encode() 和 base64.z85decode() 支持对 Z85 数据 进行编码和解码。
现在 copy 模块有一个 copy.replace() 函数,支持许多内置类型和任何定义了 __replace__() 方法的类。
新的 dbm.sqlite3 模块现在是默认的 dbm 后端。
os 模块增加了 一套新函数 用于处理 Linux 的定时器通知文件描述符。
现在 random 模块提供了一个 命令行界面。
安全改进:
ssl.create_default_context() 设置了 ssl.VERIFY_X509_PARTIAL_CHAIN 和 ssl.VERIFY_X509_STRICT 作为默认的旗标。
C API 的改进:
现在 Py_mod_gil 槽位被用来指明一个扩展模块支持在禁用 GIL 的情况下运行。
增加了 PyTime C API,提供了对系统时钟的访问。
PyMutex 是新增的轻量级互斥锁,只占用一个字节。
新增了 一套函数 用于在 C API 中生成 PEP 669 监控事件。
新的类型标注特性:
PEP 696: 类型形参 (typing.TypeVar, typing.ParamSpec 和 typing.TypeVarTuple) 现在可支持默认值。
PEP 702: 新的 warnings.deprecated() 装饰器在类型系统和运行时中增加了对标记为弃用的支持。
PEP 705: typing.ReadOnly 可被用来将 typing.TypedDict 的项标记为对类型检查器只读。
PEP 742: typing.TypeIs 提供了更直观的类型细化行为,作为对 typing.TypeGuard 的替代。
平台支持:
PEP 730: 现在 Apple 的 iOS 是 官方支持的平台,处于 第 3 层级。
PEP 738: 现在 Android 是 官方支持的平台,处于 第 3 层级。
现在 wasm32-wasi 作为 第 2 层级 的平台受到支持。
wasm32-emscripten 不再是受到官方支持的平台。
重要的移除:
PEP 594: 剩余的 19 个“死电池”(老旧 stdlib 模块)已从标准库中移除: aifc, audioop, cgi, cgitb, chunk, crypt, imghdr, mailcap, msilib, nis, nntplib, ossaudiodev, pipes, sndhdr, spwd, sunau, telnetlib, uu 和 xdrlib。
移除了 2to3 工具和 lib2to3 模块(在 Python 3.11 中已被弃用)。
移除了 tkinter.tix 模块(在 Python 3.6 中已被弃用)。
移除了 locale.resetlocale() 函数。
移除了 typing.io 和 typing.re 命名空间。
移除了链式的 classmethod 描述器。
发布计划的变化:
PEP 602 ("Annual Release Cycle for Python") 已被更新为将新发布版的完整支持 ('bugfix') 期扩展至两年。 这个更新的政策意味着:
Python 3.9--3.12 有一年半的完整支持,另加三年半的安全修正。
Python 3.13 及以后的版本有两年的完整支持,另加三年的安全修正。
新的特性
更好的交互式解释器
Python 现在默认会使用新的 interactive shell,它基于来自 PyPy 项目 的代码。 当使用从交互式终端启动 REPL 时,下列新特性将受到支持:
多行编辑并保留历史记录。
对 REPL 专属的命令如 help, exit 和 quit 的直接支持,无需以函数形式调用它们。
提示和回溯 默认启用彩色显示。
使用 F1 浏览交互式帮助并带有单独的命令历史。
使用 F2 浏览去除了输出以及 >>> 和 ... 提示符的历史。
使用 F3 进入“粘贴模式”以更方便地粘贴大段代码(再次按 F3 返回常规提示符)。
要禁用新的交互式 shell,可设置 PYTHON_BASIC_REPL 环境变量。 有关交互模式的详情,请参见 交互模式。
(由 Pablo Galindo Salgado, Łukasz Langa 和 Lysandros Nikolaou 在 gh-111201 基于来自 PyPy 项目的代码贡献。 Windows 支持由 Dino Viehland 和 Anthony Shaw 贡献。)
自由线程的 CPython
现在 CPython 具有对运行于禁用 global interpreter lock (GIL) 的自由线程模式的实验性支持。 这是一个实验性的特性因而默认是不启用的。 自由线程模式需要一个不同的可执行程序,通常名为 python3.13t 或 python3.13t.exe。 标记为 free-threaded 的预构建二进制文件可作为官方 Windows 和 macOS 安装器的一部分被安装,或者可以附带 --disable-gil 选项使用源代码来构建 CPython。
自由线程模式的执行允许在可用的 CPU 核心上并行地运行线程从而充分利用可用的处理能力。 虽然并非所有软件都能自动从中受益,但在设计时将线程纳入考虑的程序在多核心硬件上运行速度会更快。 自由线程模式是实验性的 并且处于不断改进的过程中:预计会出现一些程序错误并且在单线程场景下出现明显的性能损失。 可以选择使用环境变量 PYTHON_GIL 或命令行选项 -X gil=1 让 CPython 的自由线程构建版支持在运行时启用 GIL。
为了检查当前解释器是否支持自由线程,python -VV 和 sys.version 将包含 "experimental free-theading build" 字样。 可以使用新增的 sys._is_gil_enabled() 函数来检查正在运行的线程是否确实禁用了 GIL。
C-API 扩展模块需要针对自由线程构建版专门进行构建。 支持在禁用 GIL 的情况下运行的扩展应当使用 Py_mod_gil 槽位。 使用单阶段初始化的扩展应当使用 PyUnstable_Module_SetGIL() 来指明它们是支支持在禁用 GIL 的情况下运行。 导入不使用这些机制的 C 扩展将导致 GIL 被启用,除非通过 PYTHON_GIL 环境变量或 -X gil=0 选项显式地禁用 GIL。 需要 pip 24.1 或更新的版本才能在自由线程构建版中安装带有 C 扩展的软件包。
这项工作成为可能要感谢许多个人和组织,包括针对 Python 和第三方项目测试并启用自由线程支持的庞大的贡献者社区。 重要的贡献者包括:Sam Gross, Ken Jin, Donghee Na, Itamar Oren, Matt Page, Brett Simmers, Dino Viehland, Carl Meyer, Nathan Goldbaum, Ralf Gommers, Lysandros Nikolaou 及其他许多人。 有许多贡献者受雇于 Meta,该公司提供了大量的工程资源来支持此项目。
实验性的即时 (JIT) 编译器
当 CPython 使用 --enable-experimental-jit 选项进行配置和构建时,会添加一个即时(JIT)编译器以加快某些 Python 程序的运行速度。 在 Windows 上,可使用 PCbuild/build.bat --experimental-jit 启用 JIT 或使用 --experimental-jit-interpreter 启用第 2 层级解释器。 构建要求和进一步的支持信息 包含在 Tools/jit/README.md 中。
--enable-experimental-jit 选项接受这些(可选)值,如果不带可选值地预设 --enable-experimental-jit 则默认为 yes。
no: 禁用整个第 2 层级和 JIT 管线。
yes: 启用 JIT。 要在运行时禁用 JIT,则传入环境变量 PYTHON_JIT=0。
yes-off: 构建 JIT 但默认禁用它。 要在运行时启用 JIT,则传入环境变量 PYTHON_JIT=1。
interpreter: 启用第 2 层级解释器但是禁用 JIT。 可以在运行时传入 PYTHON_JIT=0 来禁用该解释器。
其内部架构大致如下:
我们将从特化的 第 1 层级字节码 开始。 请参阅 3.11 有什么新变化 了解详情。
当第 1 层级字节码达到足够热度,它将被翻译为新的纯内部的中间表示形式 (IR),称为 第 2 层级 IR,有时也称为微操作码 ("uops")。
第 2 层级 IR 使用与第 1 层级相同的基于栈的虚拟机,但其指令格式更适合被翻译为机器码。
在第 2 层级 IR 被解释或翻译为机器码之前,我们会预先应用一些优化通路。
虽然第 2 层级解释器存在,但它主要用于对优化管线的先前阶段进行调试。可通过为 Python 配置 --enable-experimental-jit=interpreter 选项启用第 2 层级解释器。
启用 JIT 时,经优化的第 2 层级 IR 将被翻译为机器码后再执行。
这个机器码翻译过程使用了名为 拷贝并打补丁 的技巧。 它没有运行时依赖,但增加了构建时对 LLVM 的依赖。
针对 locals() 的已定义修改语义
在历史上,改变 locals() 的返回值的预期结果是留给具体的 Python 实现来定义的。 从 Python 3.13 开始,PEP 667 标准化了 CPython 对于大多数代码执行作用域的历史行为,但也将 已优化作用域 (函数、生成器、协程、推导式和生成器表达式) 修改为显式地返回当前已赋值的局部变量的独立快照,包括局部引用的在闭包中捕获的非局部变量。
在已优化作用域中对 locals() 语义的这项修改也会影响隐式地以 locals() 为目标的代码执行函数的默认行为,如果没有提供显式命名空间的话(例如 exec() 和 eval() 等)。 在之前的版本中,在调用代码执行函数后是否可以通过调用 locals() 访问更改情况取决于具体的实现。 具体到 CPython 而言,此类代码通常会按预期工作,但有时可能会在基于其他代码(包括调试器和代码执行跟踪工具)的已优化作用域中失败,因为代码有可能重置该作用域中的共享快照。 现在,代码在已优化作用域中将始终针对局部变量的独立快照运行,因为在后续调用 locals() 时将永远看不到更改。 要访问在这些情况下所做的更改,现在必须将一个显式命名空间引用传递给相关的函数。 或者,也可以更新受影响的代码以使用更高层级的代码执行 API 返回结果代码命名空间(例如,当执行磁盘上的 Python 文件时使用 runpy.run_path() 函数)。
为确保调试器和类似工具能可靠地更新受到此变化影响的作用域中的局部变量,现在 FrameType.f_locals 将返回一个针对此种作用域中的帧的局部变量和在局部引用的非局部变量的直通写入代理对象,而不是返回一个非持续更新的具有规定义的运行时语义的共享 dict 实例。
性能优化
一些标准库模块的导入时间得到了显著改善。 例如,typing 模块的导入时间通过移除对 re 和 contextlib 的依赖而减少了大约三分之一。 其他获得导入时间加速的模块包括 email.utils, enum, functools, importlib.metadata 和 threading。 (由 Alex Waygood, Shantanu Jain, Adam Turner, Daniel Hollas 等人在 gh-109653 中贡献。)
现在对于大量输入 textwrap.indent() 相比之前可提速大约 30%。 (由 Inada Naoki 在 gh-107369 中贡献。)
现在 subprocess 模块会在更多场合下使用 posix_spawn() 函数,包括在许多现代系统平台上当 close_fds 为 True (默认值) 的时候。 当在 FreeBSD 和 Solaris 上启动进程时这应该能提供显著的性能提升。 请参阅上面的 subprocess 小节了解详情。 (由 Jakub Kulik 在 gh-113117 中贡献。)
上一篇:Pixso(UI设计工具)
下一篇:最后一页