Skip to content

Commit 29af6b7

Browse files
committed
Speed up transitive_dep_hash for singleton SCCs
1 parent 485f523 commit 29af6b7

1 file changed

Lines changed: 24 additions & 9 deletions

File tree

mypy/build.py

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5086,18 +5086,33 @@ def deps_filtered(graph: Graph, vertices: AbstractSet[str], id: str, pri_max: in
50865086

50875087
def transitive_dep_hash(scc: SCC, graph: Graph) -> bytes:
50885088
"""Compute stable snapshot of transitive import structure for given SCC."""
5089-
all_direct_deps = sorted(
5090-
{
5091-
dep
5092-
for id in scc.mod_ids
5093-
for dep in graph[id].dependencies
5094-
if graph[id].priorities.get(dep) != PRI_INDIRECT
5095-
}
5096-
)
5089+
mod_ids = scc.mod_ids
5090+
if len(mod_ids) == 1:
5091+
# Fast path: State.dependencies is already deduped and never contains
5092+
# self.id, so we can skip the dedupe set and the self-membership check.
5093+
(only_id,) = mod_ids
5094+
st = graph[only_id]
5095+
priorities = st.priorities
5096+
all_direct_deps = sorted(
5097+
dep for dep in st.dependencies if priorities.get(dep) != PRI_INDIRECT
5098+
)
5099+
buf = WriteBuffer()
5100+
for dep_id in all_direct_deps:
5101+
write_str_bare(buf, dep_id)
5102+
write_bytes_bare(buf, graph[dep_id].trans_dep_hash)
5103+
return hash_digest_bytes(buf.getvalue())
5104+
deps_set: set[str] = set()
5105+
for id in mod_ids:
5106+
state = graph[id]
5107+
priorities = state.priorities
5108+
for dep in state.dependencies:
5109+
if priorities.get(dep) != PRI_INDIRECT:
5110+
deps_set.add(dep)
5111+
all_direct_deps = sorted(deps_set)
50975112
buf = WriteBuffer()
50985113
for dep_id in all_direct_deps:
50995114
write_str_bare(buf, dep_id)
5100-
if dep_id not in scc.mod_ids:
5115+
if dep_id not in mod_ids:
51015116
write_bytes_bare(buf, graph[dep_id].trans_dep_hash)
51025117
return hash_digest_bytes(buf.getvalue())
51035118

0 commit comments

Comments
 (0)