Skip to content

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

@efenocchi

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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions