Skip to content

Remove ma_version_tag (PEP 699 / PEP 509) #124296

Closed
@colesbury

Description

@colesbury

Feature or enhancement

The accepted PEP 699 proposed removing the private ma_version_tag field from PyDictObject. Note that PEP 699 supersedes PEP 509, which originally proposed the field.

Why now?

  • The ma_version_tag field was deprecated in 3.12 and we are now working on 3.14, so I think this is in line with Python's backward compatibility policy from PEP 387.
  • Cython and PyTorch (dynamo) and Nuitka have stopped using it for CPython 3.12+. I don't think ma_version_tag ever saw widespread usage. Cython was the major user mentioned in PEP 699. 1
  • I think the ma_version_tag updates have a non-negligible cost in the free-threaded build, and it's easier and simpler to remove it (if we're planning to do that anyways) than to make it more efficient
  • It would be convenient to use some of the version tag bits for per-thread refcounting of globals and builtins. (See Mark's comment in Reference count contention with nested functions #124218 (comment)).
  • If we are going to remove this in 3.14, I think doing so earlier in the development cycle is better.

Dict Watchers

The ma_version_tag field is also used for dict watchers (8 bits) and the tier2 mutation counter (4 bits). We will still want that functionality.

cc @Fidget-Spinner @markshannon

Linked PRs

Footnotes

  1. I searched the top ~7500 sdists as well. The only other actual usage I saw was https://github.com/slezica/python-frozendict, which doesn't have a 3.11 or 3.12 C extension yet (but also functions as a pure-Python package).

Metadata

Metadata

Assignees

No one assigned

    Labels

    interpreter-core(Objects, Python, Grammar, and Parser dirs)performancePerformance or resource usagetype-featureA feature request or enhancement

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions