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

👉 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

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-0.9.1.tar.gz (788.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-0.9.1-cp38-abi3-win_amd64.whl (141.2 kB view details)

Uploaded CPython 3.8+Windows x86-64

fastquadtree-0.9.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (241.3 kB view details)

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

fastquadtree-0.9.1-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (251.1 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARMv7l

fastquadtree-0.9.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (241.1 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

fastquadtree-0.9.1-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (419.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-0.9.1.tar.gz.

File metadata

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

File hashes

Hashes for fastquadtree-0.9.1.tar.gz
Algorithm Hash digest
SHA256 1400f323a2b74a38264906626fd39238a36b0a45ecfb5f488ff4e703d06c8c6e
MD5 9da997a8023b5e891d07d033219b85d9
BLAKE2b-256 bff83be1b0ee05fed89ce638070b002a64537021ff2351b8afececfc36f51dd8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-0.9.1-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 1dd9d3caff3bce272c98bc4e74e9c467ca7f16ab82404a3a7406acadd8922d90
MD5 7684be4038dd5d269a3eebe60e00d20e
BLAKE2b-256 ea646bd9a72077feae6c1f98b1f124212eb80682a04479437ad0f4415c9b694f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-0.9.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 eaa0db43076f4ce86823291c2718bdb36e2c0ed4eef035db1b7f0a11a8a79c0a
MD5 3c8e5e7b5315748ca159e1792f969528
BLAKE2b-256 9e280001946982435453029d56f0e5a95434be2481806d7f55becdc8686adee6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-0.9.1-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 adfdee496e54e41b480a576aa6cd63c29e9ca7c7d3e8f139ca83e372ec262460
MD5 a689aafe3dfb77b983c33c96abdc99d4
BLAKE2b-256 2ff647c66e70bf7cb879dfcd3eedb46ef63cd0dcd7fd8e3d4abaf8998b296834

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-0.9.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4f6d5a728c0fa3184d3f2db6d1dc934b4dc08df8086a7c721a48cb6ffb9bf29c
MD5 e80d49ed7289209720505cebe34b4100
BLAKE2b-256 a45a8ffb56a9cdf34535ad754666a1e36c0a9390c5b278959d82d07afa2de337

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-0.9.1-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 0f9faaa427462c77a34c14cd129b656562ec2da074d5d6ecfcd9dcf8f2483ff6
MD5 fc0f0c92263cbc7c7002a7c4d46a8358
BLAKE2b-256 320494436dc0dfe6cf53515bc95a693e0d58cd660039cdbd777ed50c4275854c

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