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

  • Just pip install: prebuilt wheels for Windows, macOS, and Linux (no Rust or compiler needed)
  • The fastest quadtree Python package (>10x faster than pyqtree)
  • Clean Python API with no external dependencies and modern typing hints
  • 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 ~10x faster while keeping the same API

Install

pip install fastquadtree
from fastquadtree import QuadTree  # Point handling
from fastquadtree import RectQuadTree  # Bounding box handling
from fastquadtree import QuadTreeObjects  # Point handling with object tracking
from fastquadtree import RectQuadTreeObjects  # Bounding box handling with object tracking
from fastquadtree.pyqtree import Index  # Drop-in pyqtree shim (~10x faster while keeping the same API)

Quickstart

from fastquadtree import QuadTree

qt = QuadTree((0, 0, 1000, 1000), 16)  # bounds and capacity
qt.insert((100, 200), id_=1)  # insert point with ID 1
print(qt.query((0, 0, 500, 500)))  # gets all points in that area: [(1, 100.0, 200.0)]

See the quickstart guide or the interactive demos for more details.

Benchmarks

fastquadtree outperforms all other quadtree Python packages, including the Rtree spatial index.

Library comparison

Total time Throughput

Summary (PyQtree baseline, sorted by total time)

  • Points: 500,000, Queries: 500
Library Build (s) Query (s) Total (s) Speed vs PyQtree
fastquadtree (np)[^fqtnp] 0.052 0.017 0.068 42.52×
fastquadtree[^fqt] 0.054 0.231 0.285 10.20×
Shapely STRtree[^npreturn] 0.200 0.110 0.309 9.40×
fastquadtree (obj tracking)[^fqto] 0.263 0.093 0.356 8.17×
nontree-QuadTree 0.826 0.844 1.670 1.74×
Rtree 1.805 0.546 2.351 1.24×
e-pyquadtree 1.530 0.941 2.471 1.18×
quads 1.907 0.759 2.667 1.09×
PyQtree 2.495 0.414 2.909 1.00×

[^fqtnp]: Uses query_np for Numpy array return values rather than Python lists.
[^fqt]: Uses standard query method returning Python lists.
[^npreturn]: Uses Shapely STRtree with Numpy array points and returns.
[^fqto]: Uses QuadTreeObjects with object association.

See the benchmark section for details, including configurations, system info, and native vs shim benchmarks.

API

See the full API

QuadTree(bounds, capacity, max_depth=None, dtype="f32")

  • 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
  • dtype — data type for coordinates, e.g., "f32", "f64", "i32", "i64"

Key Methods

  • insert(xy, id_=None) -> int

  • query(rect) -> list[tuple[int, float, float]]

  • nearest_neighbor(xy) -> tuple[int, float, float] | None

  • delete(id, x, y) -> bool

For object tracking, use QuadTreeObjects instead. See the docs for more methods.

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.
  • Use QuadTree when you only need spatial indexing. Use QuadTreeObjects when you need to store Python objects with your points.
  • 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 fastquadtree, pyqtree, and brute-force mode to see the performance difference. I typically see an FPS of ~70 with fastquadtree, ~25 with pyqtree, and <1 FPS with brute-force on my machine with 1500 balls.

See the runnables guide for setup instructions.

FAQ

Can I delete items from the quadtree? Yes! Use delete(id, x, y) 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 QuadTreeObjects, 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.

Do I need NumPy installed? No, NumPy is a fully optional dependency. If you do have NumPy installed, you can use methods such as query_np and insert_many_np for better performance. Note that insert_many raises TypeError on NumPy input—you must use insert_many_np explicitly for NumPy arrays. The Rust core is able to handle NumPy arrays faster than Python lists, so there's a lot of time savings in utilizing the NumPy functions. See the Native vs Shim benchmark for details on how returing NumPy arrays can speed up queries.

# Using Python lists
qt.insert_many([(10, 20), (30, 40), (50, 60)])

# Using NumPy arrays (requires NumPy)
import numpy as np
points = np.array([[10, 20], [30, 40], [50, 60]])
qt.insert_many_np(points)  # Use insert_many_np for NumPy arrays

Does fastquadtree support multiprocessing? Yes, fastquadtree objects can be serialized to bytes using the to_bytes() method and deserialized back using from_bytes(). This allows you to share quadtree data across processes and even cache prebuilt trees to disk. When using QuadTreeObjects or RectQuadTreeObjects, you must pass include_objects=True to to_bytes() to serialize Python objects, and allow_objects=True to from_bytes() when loading. By default, objects are skipped for safety, as deserializing untrusted Python objects can be unsafe. See the interactive v2 demo for an example of saving and loading a quadtree, and the QuadTreeObjects API docs for full details on the serialization methods.

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-2.1.0.tar.gz (910.1 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

fastquadtree-2.1.0-pp310-pypy310_pp73-manylinux_2_28_armv7l.whl (444.7 kB view details)

Uploaded PyPymanylinux: glibc 2.28+ ARMv7l

fastquadtree-2.1.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl (397.0 kB view details)

Uploaded PyPymanylinux: glibc 2.28+ ARM64

fastquadtree-2.1.0-pp39-pypy39_pp73-manylinux_2_28_armv7l.whl (444.2 kB view details)

Uploaded PyPymanylinux: glibc 2.28+ ARMv7l

fastquadtree-2.1.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl (397.3 kB view details)

Uploaded PyPymanylinux: glibc 2.28+ ARM64

fastquadtree-2.1.0-cp38-abi3-win_amd64.whl (309.7 kB view details)

Uploaded CPython 3.8+Windows x86-64

fastquadtree-2.1.0-cp38-abi3-manylinux_2_28_x86_64.whl (421.8 kB view details)

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

fastquadtree-2.1.0-cp38-abi3-manylinux_2_28_armv7l.whl (444.4 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.28+ ARMv7l

fastquadtree-2.1.0-cp38-abi3-manylinux_2_28_aarch64.whl (397.3 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.28+ ARM64

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

File metadata

  • Download URL: fastquadtree-2.1.0.tar.gz
  • Upload date:
  • Size: 910.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fastquadtree-2.1.0.tar.gz
Algorithm Hash digest
SHA256 638f3c2168a49d0aade4798844c60ea971ce25a863d607a632e459aff266e87f
MD5 d03ae0f7bc4c9a6defaa432b338999c0
BLAKE2b-256 8bbd3f0cda4cfd9e4882f985c9c459602dd9ec4f4ff59e618a52ff52d7162e99

See more details on using hashes here.

File details

Details for the file fastquadtree-2.1.0-pp310-pypy310_pp73-manylinux_2_28_armv7l.whl.

File metadata

  • Download URL: fastquadtree-2.1.0-pp310-pypy310_pp73-manylinux_2_28_armv7l.whl
  • Upload date:
  • Size: 444.7 kB
  • Tags: PyPy, manylinux: glibc 2.28+ ARMv7l
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fastquadtree-2.1.0-pp310-pypy310_pp73-manylinux_2_28_armv7l.whl
Algorithm Hash digest
SHA256 326e17eb0511092985fad201f037b24c039298f3141a312ba98f50eb0d3b04d0
MD5 471f656ff218ebe7d8315e3e0ac27188
BLAKE2b-256 53c2b1903adeeeb14d52d2ab9ef25c83ac946df550e2a094f79a6f32b967be13

See more details on using hashes here.

File details

Details for the file fastquadtree-2.1.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl.

File metadata

  • Download URL: fastquadtree-2.1.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl
  • Upload date:
  • Size: 397.0 kB
  • Tags: PyPy, manylinux: glibc 2.28+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fastquadtree-2.1.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d6f720da75d939d3a9dcc6fd5240a2cd4df8801aec6b8f34aae02f4057ba92c7
MD5 ec7c45f69abd8b82b3141f5bc2fe15f1
BLAKE2b-256 a4dd4e8761b906ca7ebcc46bb73a8819c922b2a07761f8bbcd0d5b747096b143

See more details on using hashes here.

File details

Details for the file fastquadtree-2.1.0-pp39-pypy39_pp73-manylinux_2_28_armv7l.whl.

File metadata

  • Download URL: fastquadtree-2.1.0-pp39-pypy39_pp73-manylinux_2_28_armv7l.whl
  • Upload date:
  • Size: 444.2 kB
  • Tags: PyPy, manylinux: glibc 2.28+ ARMv7l
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fastquadtree-2.1.0-pp39-pypy39_pp73-manylinux_2_28_armv7l.whl
Algorithm Hash digest
SHA256 99e89ed6ef45841925ba19a23341b6bef5a02195b1b89eb96470e3382ac283aa
MD5 6473d82360a44103de645ef79b89f194
BLAKE2b-256 bb698c7000e682045116dadb224ece91731466a76e0266c439a1d727f840e23c

See more details on using hashes here.

File details

Details for the file fastquadtree-2.1.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl.

File metadata

  • Download URL: fastquadtree-2.1.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl
  • Upload date:
  • Size: 397.3 kB
  • Tags: PyPy, manylinux: glibc 2.28+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fastquadtree-2.1.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 72bc2dacde1b121a16450678469ef2285e4a8ac36fdc5cfaec43f2cca76f60dd
MD5 f7a7dd7e4736853ccdb0f09b78f9bb7a
BLAKE2b-256 65a3ad6f1f177843d978847b28573c64ea4fe81de8ce26aa566f21a6f493003a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fastquadtree-2.1.0-cp38-abi3-win_amd64.whl
  • Upload date:
  • Size: 309.7 kB
  • Tags: CPython 3.8+, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fastquadtree-2.1.0-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 4bcd8e124ce372470fb7f63901095fb5a7165b994d5df5a613ccb436e311f14d
MD5 7dcc1da9d5abc95cc8bdfd38106d6bf1
BLAKE2b-256 7fbf7344ef02def85ec4a4be0d7ed7760454c9933d783a1338b90a8164d4a84a

See more details on using hashes here.

File details

Details for the file fastquadtree-2.1.0-cp38-abi3-manylinux_2_28_x86_64.whl.

File metadata

  • Download URL: fastquadtree-2.1.0-cp38-abi3-manylinux_2_28_x86_64.whl
  • Upload date:
  • Size: 421.8 kB
  • Tags: CPython 3.8+, manylinux: glibc 2.28+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fastquadtree-2.1.0-cp38-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c707901f39426df022066a72f4e25513e041ef6542bc7becfa91d6b6272e60a1
MD5 28aae37723bcf665edef1f432788a047
BLAKE2b-256 bfbee7683867c9d9634ac481116490d362831a5ae21d87c09814783d69abc312

See more details on using hashes here.

File details

Details for the file fastquadtree-2.1.0-cp38-abi3-manylinux_2_28_armv7l.whl.

File metadata

  • Download URL: fastquadtree-2.1.0-cp38-abi3-manylinux_2_28_armv7l.whl
  • Upload date:
  • Size: 444.4 kB
  • Tags: CPython 3.8+, manylinux: glibc 2.28+ ARMv7l
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fastquadtree-2.1.0-cp38-abi3-manylinux_2_28_armv7l.whl
Algorithm Hash digest
SHA256 14218672de47b340d48f4b099e9830ebc1cc1a04df2adee2ab583d7db67fbf7e
MD5 5753aa29556b72659085ce348d408adf
BLAKE2b-256 5af01fb1cace2e0fa3cdfc22b027f5bfa66ab85ef955aade1c8b295fb846d3da

See more details on using hashes here.

File details

Details for the file fastquadtree-2.1.0-cp38-abi3-manylinux_2_28_aarch64.whl.

File metadata

  • Download URL: fastquadtree-2.1.0-cp38-abi3-manylinux_2_28_aarch64.whl
  • Upload date:
  • Size: 397.3 kB
  • Tags: CPython 3.8+, manylinux: glibc 2.28+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fastquadtree-2.1.0-cp38-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 26634fe83e44908dd4bbe7ee8b42d3f34541de1e6a90e468184d204e3c56fa73
MD5 d73663f109af5e6c5fcaa0a3200d8c2c
BLAKE2b-256 ee68912ba80b4e9db22b5657ab6ed8835086095d8f22d34d52a6ca569cbeac89

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fastquadtree-2.1.0-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
  • Upload date:
  • Size: 734.7 kB
  • Tags: CPython 3.8+, macOS 10.12+ universal2 (ARM64, x86-64), macOS 10.12+ x86-64, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fastquadtree-2.1.0-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 a8013a1865e5bb956122394a7aa98527c46ed1b925beb73ae8c4d507d5e1d5e9
MD5 ad79836a480aadde181da58f99f85cdd
BLAKE2b-256 61b87a81b681c9c2742b0dc50402220f501cc7123783ee1b154f5c05384e06f6

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