Skip to content

Perf: suffix-keyed reverse index for matchPythonSuffix (avoid O(files) scan per import) #236

Description

@efenocchi

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions