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.030 s
Library Build (s) Query (s) Total (s) Speed vs PyQtree
fastquadtree 0.023 0.007 0.030 41.31×
Shapely STRtree 0.094 0.049 0.143 8.67×
nontree-QuadTree 0.448 0.475 0.924 1.34×
Rtree 0.801 0.225 1.025 1.21×
e-pyquadtree 0.666 0.451 1.117 1.11×
PyQtree 1.066 0.175 1.241 1.00×
quads 0.969 0.330 1.299 0.96×

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.4.0.tar.gz (798.8 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.4.0-cp38-abi3-win_amd64.whl (254.0 kB view details)

Uploaded CPython 3.8+Windows x86-64

fastquadtree-1.4.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (361.3 kB view details)

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

fastquadtree-1.4.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (387.2 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARMv7l

fastquadtree-1.4.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (346.4 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

fastquadtree-1.4.0-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (627.3 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.4.0.tar.gz.

File metadata

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

File hashes

Hashes for fastquadtree-1.4.0.tar.gz
Algorithm Hash digest
SHA256 c8f295eb603208a30241d07991eb18cc6bbaeb0ee951aefd52f05d6777885203
MD5 a6246993c5692fcdf648179149d47785
BLAKE2b-256 478535856120d1f2d218ab80d0ed8960934ffd81b5cd59314ba6cb00e112d8f1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-1.4.0-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 25f9d08061ab3edd3b5fea4906ba53912ad8e9e3d9591e00cc13e7773fc55f62
MD5 e64fa87c0fad199d0be100fa52268b20
BLAKE2b-256 3d302a80ee3d4056c6ecbe8ba934f841827433937a6e644247d2140da40a17cf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-1.4.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 43aa824709d3a2cfd7185187fbdc6558a326a0f45423007b64a90d9c469f92fd
MD5 5ff128e2b80d0bbc81a821488b785fa6
BLAKE2b-256 de936a00503fe2390bdbd768b0e63312b613d103645f5fd152f0bf2e1ba5d0b5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-1.4.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 b262d697f3cbfef97bebaae711c104e5b85e78d44c75641814208ebb27ad82d2
MD5 691230542fb51773b172f416cd39e71a
BLAKE2b-256 bf42152968769fdc52996ebbbd816081876537df7a14419596c5af4f7adae0fe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fastquadtree-1.4.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e33aec940212a258b171df8978798b9c3b84d3d39b4c25e48d3b23edc308e904
MD5 abd4fe97eaa3cf06c21b9ceaee24502f
BLAKE2b-256 95148b9344572e474738575e70d6f995d693da2b44e3121cda65ea675fd29c25

See more details on using hashes here.

File details

Details for the file fastquadtree-1.4.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.4.0-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 662112d25628c7c16af52a65563deb90146222970037142f6ed20c372074ba38
MD5 53e7fced2f8a9b952ef3fa8b5a793d12
BLAKE2b-256 b27a1b3b954ca2e1bad90d02ed776cef26ced54764dfacd73745277a928415ec

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