Skip to main content

Rust-accelerated quadtree for Python with fast inserts, range queries, and k-NN search.

Project description

fastquadtree

Interactive Screenshot

Rust-optimized quadtree with a clean Python API

👉 Check out the Docs: https://elan456.github.io/fastquadtree/

PyPI Python versions Downloads Build No runtime deps

PyO3 maturin Ruff

Docs Wheels Coverage License: MIT


Why use fastquadtree

  • Clean Python API with no external dependencies and modern typing hints
  • The fastest quadtree Python package (>10x faster than pyqtree)
  • Prebuilt wheels for Windows, macOS, and Linux
  • Support for inserting bounding boxes or points
  • Fast KNN and range queries
  • Optional object tracking for id ↔ object mapping
  • Fast serialization to/from bytes
  • Support for multiple data types (f32, f64, i32, i64) for coordinates
  • 100% test coverage and CI on GitHub Actions
  • Offers a drop-in pyqtree shim that is 6.567x faster while keeping the same API

Examples

See examples of how fastquadtree can be used in the runnables section.

Install

pip install fastquadtree
from fastquadtree import QuadTree  # Point handling
from fastquadtree import RectQuadTree  # Bounding box handling
from fastquadtree.pyqtree import Index  # Drop-in pyqtree shim (6.567x faster while keeping the same API)

Benchmarks

fastquadtree outperforms all other quadtree Python packages, including the Rtree spatial index.

Library comparison

Total time Throughput

Summary (largest dataset, PyQtree baseline)

  • Points: 250,000, Queries: 500
  • Fastest total: fastquadtree at 0.030 s
Library Build (s) Query (s) Total (s) Speed vs PyQtree
fastquadtree 0.023 0.007 0.030 41.31×
Shapely STRtree 0.094 0.049 0.143 8.67×
nontree-QuadTree 0.448 0.475 0.924 1.34×
Rtree 0.801 0.225 1.025 1.21×
e-pyquadtree 0.666 0.451 1.117 1.11×
PyQtree 1.066 0.175 1.241 1.00×
quads 0.969 0.330 1.299 0.96×

See the benchmark section for details, including configurations, system info, and native vs shim benchmarks.

Quickstart

See the quickstart guide

API

See the full API

QuadTree(bounds, capacity, max_depth=None, track_objects=False, start_id=1)

  • bounds — tuple (min_x, min_y, max_x, max_y) defines the 2D area covered by the quadtree
  • capacity — max number of points kept in a leaf before splitting
  • max_depth — optional depth cap. If omitted, the tree can keep splitting as needed
  • track_objects — if True, the wrapper maintains an id → object map for convenience.
  • start_id — starting value for auto-assigned ids

Key Methods

  • insert(xy, *, id=None, obj=None) -> int

  • query(rect, *, as_items=False) -> list

  • nearest_neighbor(xy, *, as_item=False) -> (id, x, y) | Item | None

  • delete(id, xy) -> bool

There are more methods and object tracking versions in the docs.

Geometric conventions

  • Rectangles are (min_x, min_y, max_x, max_y).
  • Containment rule is closed on the min edge and open on the max edge (x >= min_x and x < max_x and y >= min_y and y < max_y). This only matters for points exactly on edges.

Performance tips

  • Choose capacity so that leaves keep a small batch of points. Typical values are 8 to 64.
  • If your data is very skewed, set a max_depth to prevent long chains.
  • For fastest local runs, use maturin develop --release.
  • The wrapper maintains an object map only if the quadtree was constructed with track_objects=True. If you don't need it, leave it off for best performance.
  • Refer to the Native vs Shim Benchmark for overhead details.

Pygame Ball Pit Demo

Ballpit_Demo_Screenshot

A simple demo of moving objects with collision detection using fastquadtree. You can toggle between quadtree mode and brute-force mode to see the performance difference.

See the runnables guide for setup instructions.

FAQ

What happens if I insert the same id more than once? Allowed. For k-nearest, duplicates are de-duplicated by id. For range queries you will see every inserted point.

Can I delete items from the quadtree? Yes! Use delete(id, xy) to remove specific items. You must provide both the ID and exact location for precise deletion. This handles cases where multiple items exist at the same location. If you're using track_objects=True, you can also use delete_by_object(obj) for convenient object-based deletion with O(1) lookup. The tree automatically merges nodes when item counts drop below capacity.

Can I store rectangles or circles? Yes, you can store rectangles using the RectQuadTree class. Circles can be approximated with bounding boxes. See the RectQuadTree docs for details.

License

MIT. See LICENSE.

Acknowledgments

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

fastquadtree-1.4.1.tar.gz (799.0 kB view details)

Uploaded Source

Built Distributions

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

fastquadtree-1.4.1-cp38-abi3-win_amd64.whl (254.2 kB view details)

Uploaded CPython 3.8+Windows x86-64

fastquadtree-1.4.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (360.6 kB view details)

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

fastquadtree-1.4.1-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (387.4 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARMv7l

fastquadtree-1.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (346.6 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

fastquadtree-1.4.1-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (627.4 kB view details)

Uploaded CPython 3.8+macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

File details

Details for the file fastquadtree-1.4.1.tar.gz.

File metadata

  • Download URL: fastquadtree-1.4.1.tar.gz
  • Upload date:
  • Size: 799.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.9.6

File hashes

Hashes for fastquadtree-1.4.1.tar.gz
Algorithm Hash digest
SHA256 5c4dc7d87644489e765b26585e3efbcc1a1075f5dd5ac307638cbbc5c6f1256b
MD5 d0760efb0cbef181083088c8dd6eff93
BLAKE2b-256 e458f327429db81b19431241f1cc780229f83970397b1ae1bce91dd206f7731c

See more details on using hashes here.

File details

Details for the file fastquadtree-1.4.1-cp38-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for fastquadtree-1.4.1-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 9437a57c3842671f7fa9fca3bd052adc4bf830b9965ba0bb551fa077f745d08b
MD5 fc5eaee4b91ccce6f7e343ce19054661
BLAKE2b-256 8fe31e6804c96709f05bf7d217fb5776be7c4af7eefac002be92bd34f3271f8c

See more details on using hashes here.

File details

Details for the file fastquadtree-1.4.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fastquadtree-1.4.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1dea329f3b175c36c1d2524edba564c213ba8b60cc7ce2d3c6f0ee115f080769
MD5 4cb33aa6fb528ea896e05d0c06fdaa94
BLAKE2b-256 0ff91ecfac6ae6165578a140975fc251365a315c75be20d3dbdb12d36b2c6463

See more details on using hashes here.

File details

Details for the file fastquadtree-1.4.1-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for fastquadtree-1.4.1-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 5f71fa6efe93828e9e2f1f66cfab96f7f9cb063194f799b5970da010175f468e
MD5 d6092ab9de6808b9d08fd0cd67489582
BLAKE2b-256 64fd6b384166bcfc0d767cd2ee2e5f424211158e892621157e8f8edda398daf6

See more details on using hashes here.

File details

Details for the file fastquadtree-1.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for fastquadtree-1.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 757f9680fef8fd302f7866ef4df0ce07cf6e621dc69a7c8f0f92d0f1507c3ed3
MD5 ef14d89439f7e8b26a9ee5aaecea1b4d
BLAKE2b-256 b9e33eda721aab9ecff7e76400c1ae1d5b2ce98bac7d6f54c20ef143d09561f6

See more details on using hashes here.

File details

Details for the file fastquadtree-1.4.1-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for fastquadtree-1.4.1-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 bb6665ff4b8c3267c8f009fd7f6711859fc19b51f9acda959f9bbc0991eb8b34
MD5 b0bba13a9dd8bd623f41b903040f326f
BLAKE2b-256 5e4a424e69b6b92afb075a28cfae929b12d4cfa0f54127e7888eab4f8c99de34

See more details on using hashes here.

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