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.120 s
Library Build (s) Query (s) Total (s) Speed vs PyQtree
fastquadtree 0.031 0.089 0.120 14.64×
Shapely STRtree 0.179 0.100 0.279 6.29×
nontree-QuadTree 0.595 0.605 1.200 1.46×
Rtree 0.961 0.300 1.261 1.39×
e-pyquadtree 1.005 0.660 1.665 1.05×
PyQtree 1.492 0.263 1.755 1.00×
quads 1.407 0.484 1.890 0.93×

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.3.1.tar.gz (799.7 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.3.1-cp38-abi3-win_amd64.whl (237.8 kB view details)

Uploaded CPython 3.8+Windows x86-64

fastquadtree-1.3.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (342.8 kB view details)

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

fastquadtree-1.3.1-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (376.7 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARMv7l

fastquadtree-1.3.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (333.5 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

fastquadtree-1.3.1-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (600.8 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.3.1.tar.gz.

File metadata

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

File hashes

Hashes for fastquadtree-1.3.1.tar.gz
Algorithm Hash digest
SHA256 83c2218067f7461672993509a2c421fc6c483e61c1cabfc124bcb69ab76aeb2b
MD5 ac7c79f56f3ce31a824dbc90c32264d7
BLAKE2b-256 12860d3d1bd7053b7e99049e5f23cbde7f3463945ca971fd8a3a31bc1e602c9f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-1.3.1-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 396893ac0fa3ff1f838e0ea0d96b71c1c7dcec41868a1db384e1c02b3c8885ab
MD5 e7fc52d8dee9b13c7338b19080226411
BLAKE2b-256 c507ca94a379f247ae39bca5c38cbd00a663450f2f63a5e69c208cd9d74ef9cc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-1.3.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 97bf8b52d921ae2f28e2e8f95d2502dad301bed370187c02d81ee77753eb9278
MD5 dbbcc4c265bc659cdf52ef681c32b4cc
BLAKE2b-256 89df6e2f314ac78f5b7d890c3534f4d6c2627d515f73a52652863bd24354d86b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-1.3.1-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 f88bc7e6265b971079fecb91082f8ed86d335a85a1d1bcf90e4be57f9a8c721f
MD5 16ddf51db30c713337be166441bd9e94
BLAKE2b-256 574c9bf75061a7288b81cef5ce714bded7ee2987ec41b86c3dc845689331e225

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-1.3.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 02c46b60ebe87dfadb59c02c779254ce762d1ef2adf7f68bfcac6a0376bc27f9
MD5 89811bf08f44e605229b218f2a6f2f10
BLAKE2b-256 8783c84ebb83c1d57efa0ab3b18963ccce75663cb5f73c38f522af0d11ea1c70

See more details on using hashes here.

File details

Details for the file fastquadtree-1.3.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.3.1-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 8632a4a23c1eb65b79e27a222de179504ac52ead27043971e4a7c53ca48b228c
MD5 f52c1d08ebd24418233341206cb758a0
BLAKE2b-256 e7f525e8b01718afd1bda75455cb14bcaafa56bf4f7ca6a924b1b41be7d2b41c

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