Context
matchPythonSuffix in src/graph/resolve/cross-file.ts resolves a dotted-absolute Python import by suffix-matching against the known-files set. For each lookup it does up to 4 target forms × a full linear scan of knownFiles:
for (const t of targets) { // 4 target forms
if (knownFiles.has(t)) return t;
for (const f of knownFiles) { // O(files) scan
if (f.endsWith(`/${t}`)) { ... }
}
}
So cross-file resolution over a Python repo is O(calls × files × 4). Fine at current scale (graphiti = 117 files, instant), but it degrades on large monorepos.
Proposal
Build a suffix-keyed reverse index once (alongside buildExportIndex), mapping every path suffix (mod.py, sub/mod.py, pkg/sub/mod.py) → list of files, then make matchPythonSuffix an O(1) lookup + ambiguity check with no per-call scan.
Notes
Context
matchPythonSuffixinsrc/graph/resolve/cross-file.tsresolves a dotted-absolute Python import by suffix-matching against the known-files set. For each lookup it does up to 4 target forms × a full linear scan ofknownFiles:So cross-file resolution over a Python repo is
O(calls × files × 4). Fine at current scale (graphiti = 117 files, instant), but it degrades on large monorepos.Proposal
Build a suffix-keyed reverse index once (alongside
buildExportIndex), mapping every path suffix (mod.py,sub/mod.py,pkg/sub/mod.py) → list of files, then makematchPythonSuffixan O(1) lookup + ambiguity check with no per-call scan.Notes