You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
λ mypy --version
mypy 1.11.2 (compiled: yes)
λ uv pip show torch
Using Python 3.11.8 environment at /Users/shantanu/.virtualenvs/openai-wfht
Name: torch
Version: 2.1.0
Location: /Users/shantanu/.virtualenvs/openai-wfht/lib/python3.11/site-packages
Requires: filelock, fsspec, jinja2, networkx, sympy, typing-extensions
Required-by: ...
λ time mypy -c 'import torch' --no-incremental
Success: no issues found in 1 source file
mypy -c 'import torch' --no-incremental 33.09s user 2.73s system 98% cpu 36.391 total
λ time mypy -c 'import torch'
Success: no issues found in 1 source file
mypy -c 'import torch' 6.24s user 0.88s system 95% cpu 7.454 total
We use a lot of torch at work, performance is probably the biggest reason folks at work switch to a different type checker.
Overall 1380 files were parsed, so 68% of processed files are in this one SCC. I've seen this pattern in other third-party packages as well -- the majority of the implementation is a single SCC.
A potential way to make the SCC smaller would be to process imports lazily in third-party modules (where this is possible, since errors aren't reported). It may be tricky to implement though, but I'll think about it more.
Performance is now a lot better, but I bet there are still some good opportunities to make this faster. Fresh CPU profiles would be interesting to see.
On the latest master, if you use --fixed-format-cache that was recently added by @ilevkivskyi, warm runs (with cache generated) are significantly faster that before. #19681 also helped with cache deserialization speed. I hope to work on #17924 to further improve performance in incremental mode.
Latest numbers from mypy master (compiled) on my desktop (with all default settings) cold and warm cache:
(mypy_dev_3_12) ivan@x333:~/src$ time mypy -c "import torch" -nauto
Success: no issues found in 1 source file
real 0m4.341s
user 0m9.317s
sys 0m0.816s
(mypy_dev_3_12) ivan@x333:~/src$ time mypy -c "import torch" -nauto
Success: no issues found in 1 source file
real 0m0.368s
user 0m0.944s
sys 0m0.277s
Activity
hauntsaninja commentedon Oct 11, 2024
If this is accurate, maybe the fscache exception handling is really slowing us down in the mypyc build.
mypyc:
native
interpreted:
interpreted
JukkaL commentedon Oct 11, 2024
mypy -vproduces details about processed files, and this seems important:Mypy detects an import cycle with 945 modules.
Overall 1380 files were parsed, so 68% of processed files are in this one SCC. I've seen this pattern in other third-party packages as well -- the majority of the implementation is a single SCC.
A potential way to make the SCC smaller would be to process imports lazily in third-party modules (where this is possible, since errors aren't reported). It may be tricky to implement though, but I'll think about it more.
hauntsaninja commentedon Oct 11, 2024
Yeah, lazy import resolution could be a massive perf win
hauntsaninja commentedon Oct 15, 2024
#17924 is the issue for tracking lazy resolution
Jukka's times in #17920 (comment) are much better than mine. #17948 is the issue for tracking performance improvements in my work environment.
JukkaL commentedon Oct 28, 2024
Performance is now a lot better, but I bet there are still some good opportunities to make this faster. Fresh CPU profiles would be interesting to see.
hauntsaninja commentedon Oct 29, 2024
Here's a new profile for 5313497 !
Install torch, along with a few extra dependencies:
Then I get the following on Python 3.11:
Here's the output of:
Flamegraph
(I realised py-spy also supports
--format speedscopewhich can be nicer, but is harder to just link on Github)JukkaL commentedon Dec 19, 2024
@hauntsaninja I've merged some additional optimizations. It would be interesting to see if the numbers have improved.
hauntsaninja commentedon Dec 20, 2024
They have indeed improved!
With this env on Python 3.11:
Running the following:
I get:
So latest master is 1.27x faster on incremental and 1.07x faster on non-incremental compared to 1.13
JukkaL commentedon Aug 21, 2025
On the latest master, if you use
--fixed-format-cachethat was recently added by @ilevkivskyi, warm runs (with cache generated) are significantly faster that before. #19681 also helped with cache deserialization speed. I hope to work on #17924 to further improve performance in incremental mode.ilevkivskyi commentedon Sep 25, 2026
Latest numbers from mypy master (compiled) on my desktop (with all default settings) cold and warm cache:
hauntsaninja commentedon Sep 29, 2026
Yeah, I see much faster results with mypy 2.3.1 (master should be even better):
Without parallel but with native parse I see 5.16s, without either I get 10.7s. This compares to 18.7s for mypy 1.13
Warm is under 400ms