lev-rs 0.6.0

An extremely fast Levenshtein distance and similarity ratio, also available for Python.
Documentation
# lev

`lev` is an extremely fast Python library for the [Levenshtein distance](https://en.wikipedia.org/wiki/Levenshtein_distance) and similarity ratio, written in Rust. 🦀

## Installation

```bash
uv add lev-rs
```

or if you prefer slow:

```bash
pip install lev-rs
```

Wheels are available for Python 3.10 through 3.15, including free-threaded builds (PEP 703), on Linux, macOS, and Windows.

## Usage

```python
import lev

lev.distance("kitten", "sitting")  # 3
lev.distance("résumé", "resume")  # 2
lev.distance("日本語", "日本")  # 1

lev.ratio("kitten", "sitting")  # 0.615...
lev.ratio("abc", "xyz")  # 0.0
lev.ratio("", "")  # 1.0
```

See the [API Reference](https://karelze.github.io/lev/api/) for details.

### Rust

`lev` is also published as the [`lev-rs`](https://crates.io/crates/lev-rs) crate:

```bash
cargo add lev-rs
```

```rust
assert_eq!(lev::distance("kitten", "sitting"), 3);
assert_eq!(lev::ratio("abc", "xyz"), 0.0);
```

The crate requires Rust 1.91 or newer. See [docs.rs](https://docs.rs/lev-rs) for details.

## Benchmarks

`lev` is compared against the fastest Levenshtein libraries for Python:
[rapidfuzz](https://github.com/rapidfuzz/RapidFuzz),
[polyleven](https://github.com/fujimotos/polyleven),
[editdistance](https://github.com/roy-ht/editdistance), and
[edlib](https://github.com/Martinsos/edlib).
Each plot shows the total time for 1,000 calls (lower is better).

> Plots were generated by GitHub Actions on Ubuntu 24.04 with Python 3.13. Reproduce them locally with [`uv run scripts/benchmark.py`]https://github.com/KarelZe/lev/blob/main/scripts/benchmark.py.

### ASCII

<picture>
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/KarelZe/lev/main/docs/assets/benchmark_ascii_dark.svg">
  <img alt="ASCII benchmark" src="https://raw.githubusercontent.com/KarelZe/lev/main/docs/assets/benchmark_ascii_light.svg">
</picture>

### Latin-1

<picture>
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/KarelZe/lev/main/docs/assets/benchmark_latin_1_dark.svg">
  <img alt="Latin-1 benchmark" src="https://raw.githubusercontent.com/KarelZe/lev/main/docs/assets/benchmark_latin_1_light.svg">
</picture>

### CJK

<picture>
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/KarelZe/lev/main/docs/assets/benchmark_cjk_dark.svg">
  <img alt="CJK benchmark" src="https://raw.githubusercontent.com/KarelZe/lev/main/docs/assets/benchmark_cjk_light.svg">
</picture>

### Emoji

<picture>
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/KarelZe/lev/main/docs/assets/benchmark_emoji_dark.svg">
  <img alt="Emoji benchmark" src="https://raw.githubusercontent.com/KarelZe/lev/main/docs/assets/benchmark_emoji_light.svg">
</picture>

### Realistic Text

A short customer support message with a few natural typos.

<picture>
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/KarelZe/lev/main/docs/assets/benchmark_realistic_dark.svg">
  <img alt="Realistic text benchmark" src="https://raw.githubusercontent.com/KarelZe/lev/main/docs/assets/benchmark_realistic_light.svg">
</picture>

### Benchmark Scripts

Reproduce benchmarks locally using the provided scripts:

```bash
# Compare against other libraries:
uv run scripts/benchmark.py

# Benchmark scaling across string lengths:
uv run scripts/benchmark_by_length.py

# Benchmark speedup across released versions:
uv run scripts/benchmark_by_version.py
```

## Contact

Open an issue or email `github@markusbilz.com`.