Benchmarks
Apache SpatialBench
Run on a single m7i.2xlarge (8 vCPU, 32 GB), the same hardware used by Apache SpatialBench. PyCanopy is measured with index_mode="auto".
SF1 (~6M trips)
PyCanopy wins 7/12 queries.

Apache SpatialBench SF1 · lower is better · bars past the cap truncated with their value · TIMEOUT / ERROR annotated
| Query | PyCanopy | SedonaDB | DuckDB | GeoPandas |
|---|---|---|---|---|
| q1 | 1.41 | 0.66 | 0.96 | 12.78 |
| q2 | 3.94 | 8.07 | 9.95 | 20.74 |
| q3 | 1.22 | 0.80 | 1.17 | 13.59 |
| q4 | 10.88 | 8.41 | 9.83 | 25.24 |
| q5 | 1.77 | 5.10 | 1.80 | 47.08 |
| q6 | 5.57 | 8.59 | 9.36 | 24.43 |
| q7 | 2.22 | 1.66 | 1.82 | 137.00 |
| q8 | 1.06 | 1.10 | 1.08 | 16.08 |
| q9 | 0.23 | 0.23 | 50.15 | 0.28 |
| q10 | 11.62 | 18.79 | 207.84 | 46.13 |
| q11 | 12.43 | 32.98 | TIMEOUT | 51.01 |
| q12 | 14.00 | 14.55 | ERROR | TIMEOUT |
SF10 (~60M trips)
PyCanopy wins 5/12 queries.

Apache SpatialBench SF10 · lower is better · bars past the cap truncated with their value · TIMEOUT / ERROR annotated
| Query | PyCanopy | SedonaDB | DuckDB | GeoPandas |
|---|---|---|---|---|
| q1 | 8.59 | 3.04 | 4.58 | ERROR |
| q2 | 8.95 | 8.89 | 8.26 | ERROR |
| q3 | 7.12 | 4.09 | 5.17 | TIMEOUT |
| q4 | 21.34 | 7.52 | 8.51 | ERROR |
| q5 | 15.22 | 50.81 | 14.40 | ERROR |
| q6 | 11.19 | 9.11 | 10.67 | ERROR |
| q7 | 22.73 | 14.44 | 14.03 | ERROR |
| q8 | 7.03 | 7.24 | 7.57 | TIMEOUT |
| q9 | 0.34 | 0.38 | 942.98 | 0.49 |
| q10 | 28.41 | 42.02 | ERROR | ERROR |
| q11 | 37.30 | 97.52 | ERROR | ERROR |
| q12 | 147.67 | 145.66 | ERROR | TIMEOUT |
All times in seconds. Bold = fastest on that query. SedonaDB, DuckDB, and GeoPandas baselines from published SpatialBench results.