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

PyO3 maturin Ruff

Docs Wheels Coverage License: MIT


Why use fastquadtree

  • Clean Python API with 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
  • 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.0.0.tar.gz (793.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.0.0-cp38-abi3-win_amd64.whl (142.9 kB view details)

Uploaded CPython 3.8+Windows x86-64

fastquadtree-1.0.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (243.1 kB view details)

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

fastquadtree-1.0.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (252.9 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARMv7l

fastquadtree-1.0.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (243.1 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

fastquadtree-1.0.0-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (422.5 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.0.0.tar.gz.

File metadata

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

File hashes

Hashes for fastquadtree-1.0.0.tar.gz
Algorithm Hash digest
SHA256 f2520cd06f11f2ee7ba8112ce9711e65b39b567c09c6efabb9399c1571455fe9
MD5 8c28026bab019aa45d768974fd25af90
BLAKE2b-256 e740fdd22a9eb4c292a4152073f4ba3dd92ce73cda1a56d0833280140fad1715

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-1.0.0-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 92d2c002dfcb75c49d78d7f03bcf0a28d8bdd72894bbaef279e6662335fdcc11
MD5 57b81848454bb6314fa1cc983417ab9d
BLAKE2b-256 6a85bf6bf7ca16e6eaf96d1f607d7658f781c45eb686c4ceb27721117ae36b5a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-1.0.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c9919cbaeda76adcba753331695c8a4600a786d11457ef71cd743a7e87db7987
MD5 f63cc2aac8e26e02c278a675299193dc
BLAKE2b-256 1d22c1ff5364ee3d3fad8f0594d80d72ee12dbbc40a8a927bb90d020d9be3415

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-1.0.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 cea3ead176f5644eceed0bbbde51475d5caf7df1f3102e875525b4e5aa5e8a30
MD5 889db735e1c3b66beaca67c90e1def56
BLAKE2b-256 85adb95245e8e42dddda740016f6e725eda657ca2471cb607cbe4d766ae09946

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-1.0.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ddfcdba63c45703f934dcf2ae25f64dcb775fa43e9ca314ae562b1e1e1dbb44f
MD5 9828276fc0091b05ae0fb27539ef3aaa
BLAKE2b-256 6b97d96c643c9651ba5e68abb99ac175ac921890769fc07c0b80187ccb329586

See more details on using hashes here.

File details

Details for the file fastquadtree-1.0.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.0.0-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 0fda74cba10a333a2f7243d7d000b5898c5bc4a35163a574d77949ffe6a8f4ad
MD5 90e11f7655febfc2d33bc984853e1932
BLAKE2b-256 6b857c6a503be9914965aad614143af6dad5743be398e3a2add0565ce6c68f40

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