MEASURED. REPRODUCIBLE. WORKLOAD-SPECIFIC.
Performance you
can inspect.
Native, eager operations on identical tables. Every result is checked against an independent row-by-row checksum. These measurements include faster and slower cases; they are not a claim of general superiority.
100,000 rows
| Operation | Sheetframe 0.1 | Sheetframe 0.2 | pandas default | pandas object | Polars | QFrame |
|---|---|---|---|---|---|---|
| Select one column | 4.78 µs | 8.78 µs | 1.03 ms | 967.26 µs | 334.09 µs | 3.75 µs |
| Filter rows | 2.12 ms | 2.19 ms | 2.69 ms | 2.67 ms | 977.34 µs | 669.13 µs |
| Group + sum | 70.77 ms | 5.07 ms | 17.33 ms | 10.26 ms | 4.13 ms | 17.46 ms |
| Stable numeric sort | 56.73 ms | 21.81 ms | 8.08 ms | 8.47 ms | 14.27 ms | — |
| Filter → group → sort | 47.28 ms | 4.72 ms | 12.17 ms | 8.85 ms | 3.64 ms | 8.81 ms |
1,000,000 rows
| Operation | Sheetframe 0.1 | Sheetframe 0.2 | pandas default | pandas object | Polars | QFrame |
|---|---|---|---|---|---|---|
| Select one column | 10.95 µs | 10.09 µs | 946.32 µs | 934.49 µs | 335.76 µs | 11.03 µs |
| Filter rows | 24.93 ms | 24.68 ms | 18.79 ms | 18.50 ms | 7.18 ms | 5.65 ms |
| Group + sum | 694.08 ms | 51.66 ms | 162.79 ms | 83.39 ms | 28.45 ms | 177.51 ms |
| Stable numeric sort | 714.27 ms | 281.51 ms | 112.86 ms | 119.29 ms | 200.29 ms | — |
| Filter → group → sort | 455.07 ms | 50.31 ms | 94.96 ms | 59.65 ms | 19.66 ms | 91.93 ms |
What these numbers mean
The input has three columns: 20 repeated string groups, float64 amounts from 0 to 999, and boolean flags. Input creation, imports, startup, result conversion and checksum validation are outside the timer. Excel I/O is not measured. All operations produce native DataFrame results; selection can share buffers and filters can use indexed views.
pandas is shown with both its default Python-backed string dtype and an explicit object string column. Optional PyArrow is absent. Polars uses eager operations and stable ordering. QFrame’s incompatible unstable sort is omitted; its group case includes a timed sort to match group order for this dataset.
Sheetframe 0.2 replaces JSON key construction with typed hashing and streamed aggregates. Large numeric columns use stable radix sorting, which consumes extra temporary memory. The native allocation benchmark reports that tradeoff separately.
A single synthetic, null-free workload cannot establish the fastest library for every job. Thread count, strings, cardinality, nulls, data distribution and hardware can change the result. Read the methodology and native allocation results, rerun the benchmark, or inspect every raw sample.