PEP 699 – 移除 PEP 509 中添加的私有字典版本字段
- 作者:
- Ken Jin <kenjin at python.org>
- 讨论列表:
- Discourse 线程
- 状态:
- 已接受
- 类型:
- 标准跟踪
- 创建:
- 2022年10月3日
- Python 版本:
- 3.12
- 历史记录:
- 2022年10月5日
- 替换:
- 509
- 决议:
- Discourse 消息
摘要
PEP 509 引入了一个私有的 ma_version_tag
字段用于字典,以允许在 CPython 和扩展库中进行优化。本 PEP 提出撤销 PEP 509 并将该字段声明为实现细节,因为它已经被替代方案取代。这将进一步允许该字段被重用于未来的优化。
动机
PEP 509 为字典引入了 ma_version_tag
字段。这个 64 位字段存储了一个版本计数器,每次字典被修改时都会更新。最初的提议是使用此版本计数器作为优化的保护措施。
从 CPython 3.11 开始,内部优化工作不再使用此字段。 PEP 659 特化的指令使用其他方法来验证某些优化是否安全。
为了在 CPython 中启用进一步的优化,本 PEP 提出 ma_version_tag
字段不再符合 PEP 509 规范。这将允许 CPython 开发人员存储其他优化信息,例如字典写入观察者。
基本原理
本 PEP 没有指定该字段将来可能用于什么目的。这是故意的,因为实现细节可能会发生变化,并且该字段应该仅用于 CPython 的内部使用。
规范
本规范撤销了 PEP 509 中的内容。Python dict
类的 ma_version_tag
字段被声明为内部实现细节,可能被完全删除,或者可能具有不同的表示形式。C 扩展不应该依赖于此字段。
向后兼容性
某些扩展使用 ma_version_tag
进行快速字典或全局变量查找。例如,Cython 使用该字段进行快速动态模块变量查找。
本 PEP 提出在访问 ma_version_tag
时发出编译器警告。在连续两个版本发布包含警告后,将根据 PEP 387 删除 ma_version_tag
。
作者能够找到的此字段的最大用户是 Cython。与 Cython 维护者的讨论表明,从 Cython 中移除对它的支持非常简单。
安全影响
PEP 509 关注整数溢出。但是,本 PEP 不会引入任何其他安全问题。
被拒绝的想法
一种可能的替代方案是保留该字段以保持向后兼容性。本 PEP 拒绝了这种替代方案,因为未来的优化将消耗更多内存,并且该字段始终被认为是私有的且未记录(除了 PEP 之外),没有向后兼容性保证。Python 中的字典被广泛使用,任何增加其内存消耗的行为都会对 Python 的性能产生不利影响。
参考实现
参考实现可以在 python/cpython#101193 中找到。
特别感谢
感谢 C.A.M. Gerlach 对本文档的编辑和措辞更改。还要感谢 Mark Shannon 和 Kumar Aditya 提供了可能的实现。
版权
本文档置于公共领域或根据 CC0-1.0-通用许可证,以两者中更宽松的许可证为准。
来源:https://github.com/python/peps/blob/main/peps/pep-0699.rst
最后修改时间:2023-09-09 17:39:29 GMT