Performance and limits#

Pure-Python complexity#

The fallback uses a memory-bounded Wagner–Fischer dynamic program.

For lengths N and M:

  • time is O(N*M);

  • working memory is O(min(N, M)).

Accelerators can use substantially faster implementations for unit-cost edit distance, but the public result must remain identical.

Ranking cost#

Ranking performs one distance computation per consumed choice.

limit reduces retained match memory, not the number of choices evaluated. A top-k ranking still examines every input candidate.

score_cutoff currently filters after exact computation and therefore is not a performance bound.

Large collections#

For large corpora, do not use edit distance as an accidental all-pairs search engine.

Prefer a staged design:

lexical/vector candidate retrieval
           ↓
     small candidate set
           ↓
     Levenshtein reranking

This gives edit distance the role it is best at: local spelling/sequence similarity rather than semantic retrieval.

Unicode#

Distance operates on the sequence Python receives. Canonically equivalent Unicode spellings can therefore have non-zero edit distance.

Normalize explicitly when your application requires that:

import unicodedata

normalize = lambda s: unicodedata.normalize("NFC", s)

left = normalize("cafe\u0301")
right = normalize("café")

No normalization is implicit because that would change metric semantics.

Backend probing#

Capability discovery should not be placed inside extremely hot application loops. rank() currently resolves backend state per candidate; maintenance finding LV-002 tracks a future per-operation execution plan.