PEP 799 – 一个专用于组织 Python 性能分析工具的 profiling
包
- 作者:
- Pablo Galindo <pablogsal at python.org>, László Kiss Kollár <kiss.kollar.laszlo at gmail.com>
- 讨论至:
- Discourse 帖子
- 状态:
- 已接受
- 类型:
- 标准跟踪
- 创建日期:
- 2025年7月21日
- Python 版本:
- 3.15
- 发布历史:
- 2025年8月1日
- 决议:
- 2025年8月21日
摘要
本 PEP 提议创建一个名为 profiling
的新标准库模块,用于在一个单一、连贯的命名空间下组织 Python 的内置性能分析工具。
本 PEP 还提议弃用 profile
模块,这是一个遗留的纯 Python 跟踪分析器。
动机
Python 目前提供了两个跟踪分析器:profile
和 cProfile
。profile
模块是用纯 Python 实现的,主要用于教学或子类化,但对于实际使用来说太慢了。cProfile
相反,是用 C 实现的,更适合实际的性能分析场景,尽管由于某些行为差异,它不能完全替代 profile
。
这两个都是跟踪分析器,这意味着它们会检测每个函数调用和返回。这种方法会引入显著的运行时开销,并可能禁用某些解释器优化,例如由 PEP 659 引入的优化。此外,cProfile
只观察主线程,这使得它在现代并发 Python 程序中用处不大。令人困惑的是,这些模块的命名暗示 profile
是规范的,而实际上它已经基本过时。
在 Python 3.15 中,一个新的采样分析器在 profile.sample
下引入。这个工具被称为 tachyon,它使用统计采样来推断性能特征,这带来了 零开销的性能分析,并且与现代 Python 解释器配合得更好。它还支持 多线程、异步函数、自由线程构建以及附加到正在运行的进程。尽管有这些优点,但 tachyon 放在 profile.sample
下具有误导性,并掩盖了其重要性。
目前,性能分析工具的组织缺乏一致、可发现的结构。提议的重组旨在更有效地引导用户使用适当的工具,澄清分析器之间的方法论区别,并为未来的扩展奠定基础。
基本原理
这种重组解决了 Python 性能分析工具的几个长期存在的问题。
首先,它通过将所有内置分析器收集到一个单一、命名清晰的命名空间下,提高了 可发现性。目前,性能分析工具分散在命名不一致、关系不清的模块中。通过引入 profiling
模块,用户将拥有一个明确且直观的位置来探索和访问性能分析功能。
其次,该提案通过根据其基础方法命名子模块来增强 清晰度——profiling.tracing
用于确定性跟踪分析器,profiling.sampling
用于统计采样分析器。这种明确的分类使得更容易理解每个工具的行为和局限性,并将 API 与鼓励用户采用的心理模型对齐。
第三,它通过使推荐工具更容易找到和使用,为开发人员提供了 指导。当前的结构可能会误导用户依赖像 profile
这样过时或性能较差的模块,仅仅因为命名优先级。通过 profiling
命名空间及其更清晰的语义,用户更有可能为其特定用例选择合适的分析器,无论是涉及低开销采样还是详细跟踪。
最后,这种结构促进了 可扩展性。通过将性能分析工具整合到统一的命名空间下,引入未来的性能分析功能(例如内存分析器、I/O 分析器或混合工具)变得简单直接,而不会使不相关的模块过载或添加冗余的顶级名称。profiling
模块为此提供了一个自然的归宿。
规范
新模块结构
本 PEP 引入了一个新的 profiling
模块,其中包含
profiling.tracing
:确定性函数调用跟踪(从cProfile
迁移)。profiling.sampling
:统计采样分析器 (tachyon)。
cProfile
的实现将迁移到 profiling.tracing
,cProfile
将作为别名保留以实现向后兼容性。tachyon 采样分析器将在 profiling.sampling
下可用。
弃用 profile
profile
模块将从 Python 3.15 开始弃用。
- 在 Python 3.15 中:导入
profile
会发出DeprecationWarning
。 - 在 Python 3.16 中:所有
profile
的使用都会发出DeprecationWarning
。 - 在 Python 3.17 中:该模块将从标准库中移除。
从 Python 3.15 开始,profiling.tracing
将优先于 cProfile
和 profile
。
在编写本文时位于 profile.sampling
模块中的代码将移至 profiling
包。
文档
Python 文档将使用新的 profiling
模块作为性能分析功能的规范入口点。它还将描述跟踪分析器和采样分析器之间的区别,并包含何时最适合使用每种类型的指导。
cProfile
的文档将继续提供,但会链接到新的 profiling
等效项。
向后兼容性
本 PEP 唯一向后不兼容的方面是将来移除 profile
模块,但这将遵循 PEP 387 程序。
安全隐患
无。
被拒绝的替代方案
重命名 cProfile
曾考虑将 cProfile
重命名为 profile.tracing
,但这一改变将影响大量现有代码。在 profiling.tracing
下维护原始名称并将其设为别名,在兼容性和清晰度之间取得了平衡。
使用 profilers
作为模块名
该模块最初提议使用 profilers
(复数),但根据社区反馈更改为 profiling
(动名词形式)。动名词形式与其他代表功能类别的 Python 标准库模块更一致。
采样分析器有多个名称
本 PEP 的早期版本提议采样分析器有两个名称:profiling.sampling
和 profiling.tachyon
。这被拒绝以避免混淆——在引入新功能时,最好有一个单一、清晰的访问路径,而不是多个别名。profiling.sampling
这个名称被选中,因为它清楚地描述了性能分析方法,而“tachyon”仍然是一个内部代号,可能会在文档中提及。
顶级 tachyon
模块
引入 import tachyon
作为新的顶级模块被拒绝。将 tachyon 归入 profiling
有助于建立逻辑结构,并防止顶级模块的泛滥,也最大限度地减少了 Python 指导委员会所要求的全局命名空间的使用。
版权
本文档置于公共领域或 CC0-1.0-Universal 许可证下,以更宽松者为准。
来源:https://github.com/python/peps/blob/main/peps/pep-0799.rst
最后修改时间:2025-10-14 21:01:51 GMT