Python 3.13 的改进

Python 3.13 是一个充满新功能和改进的优秀版本,已经有大量文章详细介绍了发布说明。因此,本文不会讨论那些已经耳熟能详的内容,只就几个不鲜为人知的改进给予介绍。

让调试变得更好

尽管 PDB 的操作界面简陋,但它毕竟简单。之前,在 PDB 中会遇到这样的问题:

try:
    1 / 0
except ZeroDivisionError as e:
    breakpoint()

那么,当读取e时会发生什么:

-> breakpoint()
(Pdb) e
*** NameError: name 'e' is not defined

现在,这个问题已被修复。

但这不是全部。PDB 本身也得到了改进:

  • 支持多行编辑。
  • 代码补全功能,如同在新的 REPL 中一样。
  • break 命令接受断点路径,因此可以方便地在任意库中动态地添加断点。
  • 在 zipapps 中支持PDB。
  • 修复了 PDB 命令行界面吞噬参数的问题。VSCode 的团队会喜欢这一点。
  • .pdbrc 文件不再损坏。
  • 在执行 exec() 后,即使是 SyntaxError,调试模式也能正常工作。

这就是使用 Python 3.13 的一个很好的理由。

文件系统操作得到了改进

一个有 30 年历史的编程语言已经能完美处理路径和文件操作了,但事实证明总有改进的空间。

提供高级文件系统操作(如递归删除或复制)的 shutil 模块进行了许多调整:修复了大量错误(特别是在递归过程中的错误处理),并增加了选项(例如:选择如何处理符号链接)。

同样适用于 zipfile.Path,这是一个与 pathlib 兼容的遍历 zip 文件的包装器,自 3.8 起就存在。在 3.13 对其进行了许多根本改进,特别是改善了如何处理目录,从前需要大量的手动操作。

最后,pathlib 本身也进行了许多细微的性能优化,现在许多操作在后台使用字符串而不是 Path 对象。序列化也应该更快。

不仅仅是速度提升,还有 API 的漂亮调整。例如:Path.glob() 和 rglob() 现在接受路径类对象作为模式,如果以 ** 结束模式,Path.glob() 将返回文件和目录,并新增了 Path.from_uri() 方法。

并发处理上的小进步

asyncio.as_completed() 现在返回一个既是异步迭代器又是普通迭代器的对象。虽然不算大改进,但很不错。

asyncio.TaskGroup 非常棒,如果还没用它,建议尝试一下。现在,当在一个未激活的任务组上调用create_task() 时,它将关闭协程,防止出现 RuntimeWarning。

queue.Queue 现在可以通过 shutdown() 方法显式关闭,这有助于告知系统停止向其提交任务。

多线程池的最大工作线程数已增加到 62 以上。

性能改建还很难

性能改进在这个版本中并没有达到预期,就像 3.12 版本一样,在传统的异步操作基准测试中只略有提高。让 Python 更快比 Guido 想象的要难得多。

除此之外,还有很多可改进的空间,此处不一一列举,继续期待再升级。

一些小惊喜

Python 3.13 的一些小改进,或许会给某些应用者带来惊喜:

  • python -m venv 现在会添加一个 .gitignore 文件,自动忽略 venv 目录。
  • json.dumps() 在使用缩进时现在使用 C JSON 编码器,使其速度更快。著名的尾随逗号(trailing coma,详见在线图书《Python与AI同行:从小白到专家》第12章的12.2用Python读写JSON数据)导致的解析错误现在更清晰。
  • 可以向枚举中添加私有成员。
  • atexit() 在多线程方面表现更好。
  • 数据类现在每个数据类调用一次 exec(),而不是每添加一个方法调用一次。这可以将数据类创建速度提高多达20%。
  • 添加了融合乘加操作,通过 math.fma(x, y, z) 实现。
  • time.sleep() 进行了改进,参数可以是浮点数。
  • re 模块函数如 re.findall(), re.split(), re.search()re.sub() 在执行短时间重复匹配时现在可以被用户中断。减少了阻止 Ctrl + C 工作机会。
  • str.replace()count 参数现在可以作为关键字参数使用。

其他的优化,如果有兴趣的读者,可以去查阅 Python 3.13 的文档。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部