Skip to content

Commit 7d81f29

Browse files
authored
Speed up State.finish_passes (#18302)
Don't use a set to deduplicate mypy `Type` objects, since taking the hash of a type, and possibly comparing for equality (which is needed to add a type to a set) is more expensive than processing duplicates in TypeIndirectionVisitor. Many of the most expensive types to process are complex types such as callables, which often don't have many duplicates and have complex `__hash__` methods. This seems to speed up type checking torch slightly, by about 0.5% (average of 100 runs).
1 parent 7e79c4a commit 7d81f29

File tree

1 file changed

+8
-11
lines changed

1 file changed

+8
-11
lines changed

mypy/build.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2373,23 +2373,20 @@ def finish_passes(self) -> None:
23732373
# We should always patch indirect dependencies, even in full (non-incremental) builds,
23742374
# because the cache still may be written, and it must be correct.
23752375
# TODO: find a more robust way to traverse *all* relevant types?
2376-
expr_types = set(self.type_map().values())
2377-
symbol_types = set()
2376+
all_types = list(self.type_map().values())
23782377
for _, sym, _ in self.tree.local_definitions():
23792378
if sym.type is not None:
2380-
symbol_types.add(sym.type)
2379+
all_types.append(sym.type)
23812380
if isinstance(sym.node, TypeInfo):
23822381
# TypeInfo symbols have some extra relevant types.
2383-
symbol_types.update(sym.node.bases)
2382+
all_types.extend(sym.node.bases)
23842383
if sym.node.metaclass_type:
2385-
symbol_types.add(sym.node.metaclass_type)
2384+
all_types.append(sym.node.metaclass_type)
23862385
if sym.node.typeddict_type:
2387-
symbol_types.add(sym.node.typeddict_type)
2386+
all_types.append(sym.node.typeddict_type)
23882387
if sym.node.tuple_type:
2389-
symbol_types.add(sym.node.tuple_type)
2390-
self._patch_indirect_dependencies(
2391-
self.type_checker().module_refs, expr_types | symbol_types
2392-
)
2388+
all_types.append(sym.node.tuple_type)
2389+
self._patch_indirect_dependencies(self.type_checker().module_refs, all_types)
23932390

23942391
if self.options.dump_inference_stats:
23952392
dump_type_stats(
@@ -2418,7 +2415,7 @@ def free_state(self) -> None:
24182415
self._type_checker.reset()
24192416
self._type_checker = None
24202417

2421-
def _patch_indirect_dependencies(self, module_refs: set[str], types: set[Type]) -> None:
2418+
def _patch_indirect_dependencies(self, module_refs: set[str], types: list[Type]) -> None:
24222419
assert None not in types
24232420
valid = self.valid_references()
24242421

0 commit comments

Comments
 (0)