@@ -5086,18 +5086,33 @@ def deps_filtered(graph: Graph, vertices: AbstractSet[str], id: str, pri_max: in
50865086
50875087def 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