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

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
  • 100% test coverage and CI on GitHub Actions
  • Offers a drop-in pyqtree shim that is 6.567x faster while keeping the same API

👉 Docs: https://elan456.github.io/fastquadtree/

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.2.0.tar.gz (804.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.2.0-cp38-abi3-win_amd64.whl (173.5 kB view details)

Uploaded CPython 3.8+Windows x86-64

fastquadtree-1.2.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (274.3 kB view details)

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

fastquadtree-1.2.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (298.7 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARMv7l

fastquadtree-1.2.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (272.9 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

fastquadtree-1.2.0-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (476.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.2.0.tar.gz.

File metadata

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

File hashes

Hashes for fastquadtree-1.2.0.tar.gz
Algorithm Hash digest
SHA256 1b5276084c670d438fddeee78ee24bc39a6e26980596160f1b32fd9d6c254b75
MD5 cc68f9cb08923f817a4749df9b0d14f2
BLAKE2b-256 ed88528a624a409dfd936e9b3a97aa47469797005f568afb1b3514fe83a2e394

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-1.2.0-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 c63a879ac0d57cde28fe5235480f890234543473bdde2b455bbfc6f11ef01519
MD5 0de94ccbe7a60f06df54a5eeff8efbe2
BLAKE2b-256 5b71675a62e73e78494177866ca81e11f78cc2b531ac14f546a94d4a112140e1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-1.2.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bd34ad668f9a183164ba4ab6d93d0bb836fbc139d9d0c8dc64e86740f8034c69
MD5 0cf9e67a2500576dcd5ac9ab29e479da
BLAKE2b-256 9a4bdf0f139338f2aa9e8769d7f675a1d3ab55da2ab31e8baa5c4ae27809da0d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-1.2.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 5e9b53f089e083a644f3d2f23a2938802a75b6fdc0abda19fbcde10f90ea02bd
MD5 ac5dad22464fa75eb329a41539c632e8
BLAKE2b-256 a0b3edf89c7d7d8cf53223f53135635c7dfe2a58c83ec3dd579568b3fcdfef12

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-1.2.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7f27547a2a0092c6398bdb61572d9f16d263bd168a1578e19adce8a122fb8d2a
MD5 a52774428ea9dc36fbfaaecac130adfd
BLAKE2b-256 36860f52c72f04aef0f928a87af71cc85a1a8040e6043d679e31dc80041852a1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-1.2.0-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 a57be6ab4fdc562d55b868a448a395a923c4dd4974d74200f5c382c0101d8e3d
MD5 56ac1144ce1bec18cbe46a17e97ff89c
BLAKE2b-256 5528a3091abea197167898e6ba94faab311bf83cd7610139135a7790d6d5773a

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