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.0.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.0-cp38-abi3-win_amd64.whl (141.1 kB view details)

Uploaded CPython 3.8+Windows x86-64

fastquadtree-0.9.0-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.0-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.0-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.0-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.0.tar.gz.

File metadata

  • Download URL: fastquadtree-0.9.0.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.0.tar.gz
Algorithm Hash digest
SHA256 43bc6a8edeadb78dcaa018d45e2998281d6bbf89d26ec529d8ebd4bce694c7b9
MD5 182ca05733a421b454dbef092eebc584
BLAKE2b-256 ac467c809d51f5f54755e8931a34b81b9ef0847e8cc97ed9ea7edf797dfa412b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-0.9.0-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 3c869e23a1e146852ed3f9c578efc064c7f11bdaa1067adde85b6d01274fe4f2
MD5 e4090729889060c15b74853033488a90
BLAKE2b-256 f9c4ab8c06d965f062fae2f2fd457c888eb3ee6e39289997970e1160e7907a46

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-0.9.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4779d93bca692afe0aefdca30198df34cbdea80055901c0441fbed9cfe6fdc80
MD5 b0a75a227699f7cc9e0d8904c887b523
BLAKE2b-256 0d03f6e80aaee3cc3952255aa269c3885e037122cf13d6f84c9ca0ced6384ae8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-0.9.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 a0049b09f7249a20a3d92ce46af050906e65b1b63a01b1f66de97a2f41a2624e
MD5 995b6015451d62cc94e6046e479600c8
BLAKE2b-256 cfbade646e73c52621166b1dd2492e2e0cbe48ab52c21e80d4b9d4b9b1d8f222

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-0.9.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5ea5e196a3f76350251b6ade0e5459e627b7baeecfb3f7aab384fe8a647820f7
MD5 a6cadb6cdf4b46163df991ec970a7758
BLAKE2b-256 f3ff511f38f4462d8d66bbe545250117f6a11fdb72ac770b33d050c018df2980

See more details on using hashes here.

File details

Details for the file fastquadtree-0.9.0-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.0-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 84b560cbb10569cf0691899e96c06e75ef222a8d2efdfc8c2e7ec1dce3d2b676
MD5 b564e5c21a16763e839c2694b06e0fe7
BLAKE2b-256 ea83c245b33ff9446bda472a85f736a020db9afce7048c7269a21897a3271f74

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