GeezerVison is showing github.com — gh-159137: Copy and subtract the GC reference counts in one walk by pablogsal · Pull Request #159163 · python/cpython
Conversation
pablogsal
commented
Oct 11, 2026
•
edited
Loading
Uh oh!
There was an error while loading. Please reload this page.
The collector walks the generation once in update_refs() to copy every reference count into the GC header, and again in subtract_refs() to subtract the references between the collected objects. In a full collection every tracked object is in the list, so the second walk needs nothing from the first, and this does both in one walk. An object that is decremented before the walk reaches it still holds its _gc_prev pointer, and the walk recovers the decrements from the difference with the pointer it knows was there.
Benchmarks
CPU time spent in the collector, taken in gc.callbacks. Six runs per executable in baseline/candidate/candidate/baseline order; medians of the runs taken while the machine was quiet.
| Workload |
GC before |
GC after |
Less GC time |
| Pylint on five stdlib packages |
2.171 s |
1.815 s |
16.4% |
| Parso parsing the standard library |
1.352 s |
1.095 s |
19.0% |
| sqlglot parsing and transpiling 4,000 queries |
3.806 s |
3.162 s |
16.9% |
| Beautiful Soup parsing 90 HTML pages |
2.068 s |
1.815 s |
12.2% |
| Geometric mean |
|
|
16.2% |
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
Closing this PR. I’ve learned that @brandtbucher's mentee has been working on something very close to this for a while and was planning to open source it once a few things cleared up. Rather than duplicate that effort, I’d prefer to focus on their work and help get it upstream, so I’ll be following up on that instead :)
|
SurenNihalani reacted with thumbs up emoji
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Oct 23, 2026
Reviewers
ericsnowcurrently
Awaiting requested review from ericsnowcurrently
ericsnowcurrently is a code owner
nascheme
Awaiting requested review from nascheme
Uh oh!
There was an error while loading. Please reload this page.
Assignees
No one assigned
Milestone
No milestone
Development
Successfully merging this pull request may close these issues.
Uh oh!
There was an error while loading. Please reload this page.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.