Skip to main content

Rust-powered DeepDiff core

Project description

turbodiff logo

Turbodiff

PyPI - Version GitHub CI

Zero dependencies ✨ Rust-based 🦀 Super fast 🚀

Turbodiff is a super fast diffing library built from the ground up in Rust for speed and consistency. It focuses on core diffing behavior and exposes both a Rust API and Python bindings.

turbodiff speed

Credits

This project is inspired by and compatible with the design of DeepDiff.

It was vibe-coded with gpt-5.2-codex. Contributions are welcome.

Features

  • DeepDiff-style output keys: values_changed, dictionary_item_added, dictionary_item_removed, iterable_item_added, iterable_item_removed, type_changes
  • Options for order ignoring, numeric type tolerance, significant digits, epsilon comparisons, include/exclude paths, and verbose level
  • Rust core + Python bindings via pyo3/maturin

Status

This is an early, focused implementation. It targets the most common DeepDiff use cases and is intended as a drop-in replacement for the supported subset.

Installation (Python)

Install from PyPI with pip:

pip install turbodiff

For local development builds, the Python package is built with maturin:

maturin develop --features python

Installation (Rust)

Install from crates.io with cargo:

cargo add turbodiff

Usage (Python)

from turbodiff import DeepDiff

diff = DeepDiff({"a": 1}, {"a": 2})
print(diff.to_dict())
> {'values_changed': {"root['a']": {'old_value': 1, 'new_value': 2}}}

# Truthiness follows DeepDiff semantics
assert not diff # will raise AssertionError

Usage (Rust)

use serde_json::json;
use turbodiff::{DeepDiff, DeepDiffOptions};

let t1 = json!({"a": 1});
let t2 = json!({"a": 2});
let diff = DeepDiff::new(t1, t2);
println!("{}", diff.to_value());

let options = DeepDiffOptions::default().ignore_order(true);
let diff = DeepDiff::with_options(json!([1, 2]), json!([2, 1]), options);
assert_eq!(diff.to_value(), json!({}));

Pretty Output

from turbodiff import DeepDiff
from copy import deepcopy

d = {
    "a": 2,
    "b": 3,
    "c": 4,
    "d": {
        "x": {
            "y": 7,
            "z": 8,
        },
    },
    "g": [1, 2, 3],
    "i": None,
    "k": {"a", "b"},
}
d2 = deepcopy(d)
d2["a"] = 3
d2["d"]["x"]["x"] = None
d2["i"] = 2
d2["k"] = {"a", "c"}
diff = DeepDiff(d, d2)
print(diff.pretty())
> a
>    - 2
>    + 3
> ...
> d
> ╰── x
>     ╰── x
>         + None
> ...
> i
>    - (null) None
>    + (int) 2
> k
> ╰── [1]
>     - 'b'
>     + 'c'

# Compact output
print(diff.pretty(compact=True))
> a
>    - 2
>    + 3
> ...
> d.x.x
>    + None
> ...
> i
>    - (null) None
>    + (int) 2
> k[1]
>    - 'b'
>    + 'c'

Supported keyword options (Python)

All options are passed as keyword arguments to DeepDiff(...).

Option Type Behavior
ignore_order bool Treat arrays as multisets (order-insensitive).
ignore_numeric_type_changes bool Treat int/float type changes as value changes.
ignore_string_type_changes bool Treat str/bytes type changes as value changes.
ignore_type_in_groups list[tuple[type, ...]] Treat types in each group as compatible (type changes become value changes). Example: [(int, float), (bool, str)].
significant_digits int | None Compare numbers rounded to N significant digits.
math_epsilon float | None Absolute tolerance for numeric comparison (alias for atol).
atol float | None Absolute tolerance for numeric comparison.
rtol float | None Relative tolerance for numeric comparison. Uses abs(a-b) <= max(atol, rtol * max(abs(a), abs(b))).
include_paths list[str] Only diff paths that match these prefixes.
exclude_paths list[str] Skip any paths that match these prefixes.
verbose_level int (0 or 1) 0 returns paths only for values_changed.

Development

  • Rust tests: cargo test
  • Python tests: pytest

Contributing

Issues and PRs are welcome. Please include a minimal repro and tests where possible.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

turbodiff-1.3.5.tar.gz (446.1 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

turbodiff-1.3.5-cp38-abi3-win_amd64.whl (274.3 kB view details)

Uploaded CPython 3.8+Windows x86-64

turbodiff-1.3.5-cp38-abi3-manylinux_2_34_x86_64.whl (428.2 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.34+ x86-64

turbodiff-1.3.5-cp38-abi3-macosx_11_0_arm64.whl (371.3 kB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

File details

Details for the file turbodiff-1.3.5.tar.gz.

File metadata

  • Download URL: turbodiff-1.3.5.tar.gz
  • Upload date:
  • Size: 446.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for turbodiff-1.3.5.tar.gz
Algorithm Hash digest
SHA256 2ff7f01c66b549c40c7b02f89a482ff0eb2f73972a133d2f8b9d3360c4d8d4a9
MD5 ef43f74c9413da3a30baed2d54fe6709
BLAKE2b-256 81f81e67f9e1f057834e41c76fbb316e354ada181a1850397275d98116b8d2dc

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbodiff-1.3.5.tar.gz:

Publisher: ci.yml on BrightNight-Energy/turbodiff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbodiff-1.3.5-cp38-abi3-win_amd64.whl.

File metadata

  • Download URL: turbodiff-1.3.5-cp38-abi3-win_amd64.whl
  • Upload date:
  • Size: 274.3 kB
  • Tags: CPython 3.8+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for turbodiff-1.3.5-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 6a0ec8d867a77ced7e4c318ee654942e5bf6d2087f92e82157ec40adcc104d7b
MD5 33471cb3cc405a3ab396fa38320d1a0a
BLAKE2b-256 0e628f7cbca33df7fc3614295a66c7ad464dc41c21bdc7aecd8a1e26087b967c

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbodiff-1.3.5-cp38-abi3-win_amd64.whl:

Publisher: ci.yml on BrightNight-Energy/turbodiff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbodiff-1.3.5-cp38-abi3-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for turbodiff-1.3.5-cp38-abi3-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 e8ee51b2f28240ab29f34f522c928151d6087aee356642e156aa3d3a4545a4de
MD5 f11154d59e81ca0075d3813b7f71a533
BLAKE2b-256 7fcd1f5f78f6b50b6e01ae335f8a9efa8392e19d5852583b91f96113d54ae235

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbodiff-1.3.5-cp38-abi3-manylinux_2_34_x86_64.whl:

Publisher: ci.yml on BrightNight-Energy/turbodiff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbodiff-1.3.5-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for turbodiff-1.3.5-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ad31a3fb076bca8b568fc351ca0c90308b157a82585f7d99f48ee68a70c063f0
MD5 6887b332b0de5eb53ad501536620b805
BLAKE2b-256 0330a54cf6ed572b514e69846bd6fe42e8ca90a57638cdb77289ae5bcfd0e62c

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbodiff-1.3.5-cp38-abi3-macosx_11_0_arm64.whl:

Publisher: ci.yml on BrightNight-Energy/turbodiff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page