Skip to content

Prepare fixup for lazy deserialization#21170

Merged
ilevkivskyi merged 5 commits intopython:masterfrom
ilevkivskyi:lazy-2
Apr 9, 2026
Merged

Prepare fixup for lazy deserialization#21170
ilevkivskyi merged 5 commits intopython:masterfrom
ilevkivskyi:lazy-2

Conversation

@ilevkivskyi
Copy link
Copy Markdown
Member

Together with #21158, this gets us 95% there for lazy desrialization. Implementation is generally straightforward. At some point I wanted to unify the new global state with (parts of) the checker state, and potentially get rid of a bunch of named_type callbacks we pass around, but decided to do this later in a separate PR, since this is not strictly necessary for parallel checking.

Although this PR itself only makes fixup phase (which is the smaller part of deserialization) lazy, it already shows small performance improvements:

  • ~net zero on self-check
  • few percent faster cold torch with 4 workers
  • ~15% faster warm torch

cc @JukkaL

@github-actions

This comment has been minimized.

Comment thread mypy/nodes.py
self.kind, self._node, self.module_public, self.implicit, self.module_hidden
)
new.cross_ref = self.cross_ref
new.unfixed = self.unfixed
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to copy stored_info here?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch! I think that although it is a "short lived" attribute, for consistency we should.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 9, 2026

According to mypy_primer, this change doesn't affect type check results on a corpus of open source code. ✅

@ilevkivskyi
Copy link
Copy Markdown
Member Author

I am going to merge this now and will enable proper lazy deserialization after #21158 is merged as well.

@ilevkivskyi ilevkivskyi merged commit 4c85ff0 into python:master Apr 9, 2026
24 checks passed
@ilevkivskyi ilevkivskyi deleted the lazy-2 branch April 9, 2026 16:13
ilevkivskyi added a commit that referenced this pull request Apr 13, 2026
This is a follow-up for #21170

Now that we have `modules` available as part of the global state (for
the purposes of lazy deserialization), I propose to gradually move away
from (IMO awkward) architecture where we pass around a lot of
`named_type` callbacks, and instead use:
* A library of lookup functions (we already started migrating lookup
functions to `lookup.py`)
* And the newly added global modules state

I am not sure yet what is the best way to use instance cache in a most
robust way. For now I am starting with something a bit ad-hoc. We can
experiment with this, and see if this works.

Note I only migrate few most problematic cases of the old callback-based
pattern (one of those actually used an invalid callback). I also rename
the global state file added in #21170
to have more generic name.

This also removes one function-level import and few nested functions,
which may make code faster with mypyc (I measure 0.5% improvement, but
this is at the noise level).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants