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 时发出编译器警告。在连续两个版本发布警告后,ma_version_tag 将被移除,这与 PEP 387 的规定一致。
作者能找到的该字段的最大用户是 Cython。与 Cython 维护者的讨论表明,从 Cython 中移除对它的支持是微不足道的。
安全隐患
PEP 509 关注整数溢出。然而,本 PEP 不会引入任何额外的安全问题。
被拒绝的想法
一个可能的替代方案是保留该字段以实现向后兼容性。本 PEP 拒绝该替代方案,因为未来的优化将消耗更多内存,并且该字段除 PEP 外一直被认为是私有和未文档化的,没有向后兼容性保证。Python 中的字典被普遍使用,其内存消耗的任何增加都将对 Python 的性能产生不利影响。
参考实现
参考实现可以在 python/cpython#101193 中找到。
特别鸣谢
感谢 C.A.M. Gerlach 对本文档的编辑和措辞修改。同时感谢 Mark Shannon 和 Kumar Aditya 提供了可能的实现方案。
版权
本文档置于公共领域或 CC0-1.0-Universal 许可证下,以更宽松者为准。
来源: https://github.com/python/peps/blob/main/peps/pep-0699.rst
最后修改: 2025-02-01 08:55:40 GMT