csvlite vs pandas · measured 29 September 2026
Skip the notebook.
Get the answer 57.3× sooner.
Same files, same laptop, CSV to answer. Median of 5 runs.
typical57.3× fastermedian of 27 measured queries
best case162× fasterText match, 1 GB
1 GB49.4–162×faster on every query
10 GBonly csvlitepandas runs out of memory at 8 GB
Every query
10 MB
53,596 rows · 15 columns · File in page cache
| Query | csvlite | pandas | Bars | vs pandas |
|---|---|---|---|---|
| Text matchregion = north | 10 ms | 156 ms | 15.6× faster | |
| Regex searchdescription has the word café | 14 ms | 190 ms | 13.2× faster | |
| Number rangeamount 25,000–75,000 | 10 ms | 157 ms | 16.4× faster | |
| Date rangeoccurred_at in a range | 10 ms | 151 ms | 15.8× faster | |
| Sort textevery row by region | 10 ms | 166 ms | 17.5× faster | |
| Sort numbersevery row by amount | 10 ms | 162 ms | 16.6× faster | |
| Sort datesevery row by occurred_at | 12 ms | 153 ms | 12.8× faster | |
| Group + sumcount, sum(amount) by region, status | 12 ms | 167 ms | 13.9× faster | |
| Group + distinct…plus distinct descriptions | 12 ms | 181 ms | 14.6× faster |
Chart data
| After | csvlite | pandas |
|---|---|---|
| Open | 10 ms | 148 ms |
| Text match | 12 ms | 151 ms |
| Regex search | 18 ms | 185 ms |
| Number range | 20 ms | 198 ms |
| Date range | 23 ms | 204 ms |
| Sort text | 25 ms | 222 ms |
| Sort numbers | 27 ms | 236 ms |
| Sort dates | 30 ms | 244 ms |
| Group + sum | 34 ms | 266 ms |
| Group + distinct | 40 ms | 296 ms |
100 MB
532,923 rows · 15 columns · File in page cache
| Query | csvlite | pandas | Bars | vs pandas |
|---|---|---|---|---|
| Text matchregion = north | 15 ms | 1.4 s | 97.1× faster | |
| Regex searchdescription has the word café | 32 ms | 1.7 s | 53.9× faster | |
| Number rangeamount 25,000–75,000 | 21 ms | 1.6 s | 76.3× faster | |
| Date rangeoccurred_at in a range | 19 ms | 1.5 s | 78.5× faster | |
| Sort textevery row by region | 29 ms | 1.7 s | 57.0× faster | |
| Sort numbersevery row by amount | 26 ms | 1.6 s | 62.3× faster | |
| Sort datesevery row by occurred_at | 27 ms | 1.6 s | 58.4× faster | |
| Group + sumcount, sum(amount) by region, status | 29 ms | 1.7 s | 57.3× faster | |
| Group + distinct…plus distinct descriptions | 39 ms | 1.7 s | 44.6× faster |
Chart data
| After | csvlite | pandas |
|---|---|---|
| Open | 11 ms | 1.5 s |
| Text match | 14 ms | 1.5 s |
| Regex search | 35 ms | 1.8 s |
| Number range | 45 ms | 2.0 s |
| Date range | 53 ms | 2.0 s |
| Sort text | 69 ms | 2.2 s |
| Sort numbers | 83 ms | 2.4 s |
| Sort dates | 97 ms | 2.5 s |
| Group + sum | 114 ms | 2.7 s |
| Group + distinct | 140 ms | 2.9 s |
1 GB
5,300,205 rows · 15 columns · File in page cache
| Query | csvlite | pandas | Bars | vs pandas |
|---|---|---|---|---|
| Text matchregion = north | 90 ms | 15 s | 162× faster | |
| Regex searchdescription has the word café | 264 ms | 17 s | 65.9× faster | |
| Number rangeamount 25,000–75,000 | 172 ms | 16 s | 90.7× faster | |
| Date rangeoccurred_at in a range | 139 ms | 15 s | 105× faster | |
| Sort textevery row by region | 226 ms | 17 s | 72.9× faster | |
| Sort numbersevery row by amount | 197 ms | 16 s | 80.2× faster | |
| Sort datesevery row by occurred_at | 191 ms | 15 s | 78.3× faster | |
| Group + sumcount, sum(amount) by region, status | 236 ms | 16 s | 66.5× faster | |
| Group + distinct…plus distinct descriptions | 362 ms | 18 s | 49.4× faster |
Chart data
| After | csvlite | pandas |
|---|---|---|
| Open | 69 ms | 14 s |
| Text match | 99 ms | 14 s |
| Regex search | 303 ms | 18 s |
| Number range | 413 ms | 19 s |
| Date range | 491 ms | 20 s |
| Sort text | 654 ms | 22 s |
| Sort numbers | 791 ms | 24 s |
| Sort dates | 920 ms | 25 s |
| Group + sum | 1.1 s | 26 s |
| Group + distinct | 1.4 s | 29 s |
10 GB
53,002,050 rows · 15 columns · Cold cache: evicted from memory before every run
| Query | csvlite | pandas | Bars | vs pandas |
|---|---|---|---|---|
| Text matchregion = north | 4.6 s | out of memory | only csvlite | |
| Regex searchdescription has the word café | 6.2 s | out of memory | only csvlite | |
| Number rangeamount 25,000–75,000 | 5.3 s | out of memory | only csvlite | |
| Date rangeoccurred_at in a range | 5.0 s | out of memory | only csvlite | |
| Sort textevery row by region | 9.1 s | out of memory | only csvlite | |
| Sort numbersevery row by amount | 6.4 s | out of memory | only csvlite | |
| Sort datesevery row by occurred_at | 6.3 s | out of memory | only csvlite | |
| Group + sumcount, sum(amount) by region, status | 5.7 s | out of memory | only csvlite | |
| Group + distinct…plus distinct descriptions | 7.2 s | out of memory | only csvlite |
Chart data
| After | csvlite | pandas |
|---|---|---|
| Open | 3.1 s | — |
| Text match | 4.7 s | — |
| Regex search | 7.8 s | — |
| Number range | 9.9 s | — |
| Date range | 12 s | — |
| Sort text | 18 s | — |
| Sort numbers | 21 s | — |
| Sort dates | 24 s | — |
| Group + sum | 27 s | — |
| Group + distinct | 31 s | — |
The code you’d write
As benchmarked
Text matchcsvlite 90 mspandas 15 sat 1 GB
df = pd.read_csv("data.csv", dtype=str, na_filter=False)
df["region"].eq("north").sum()csvliteAdd filter · region = north
Sort numberscsvlite 197 mspandas 16 sat 1 GB
df = pd.read_csv("data.csv", dtype=str, na_filter=False)
amount = pd.to_numeric(df["amount"], errors="coerce")
amount.sort_values(kind="mergesort", na_position="last")csvliteClick the amount header
Group + sumcsvlite 236 mspandas 16 sat 1 GB
df = pd.read_csv("data.csv", dtype=str, na_filter=False)
(df.assign(_amount=pd.to_numeric(df["amount"], errors="coerce"))
.groupby(["region", "status"], dropna=False)
.agg(count=("region", "size"), total=("_amount", "sum")))csvlitePivot · region, status · Sum of amount
- Machine
- Intel Core i7-11850H · 32 GB RAM · NVMe SSD · Linux. Every run capped at 8 GB of memory.
- Versions
- csvlite 1.0.0 · DuckDB 1.5.5 · Polars 1.44.2 · pandas 3.0.6. All columns read as text.
- Timing
- CSV to answer, fresh process per run, startup excluded. ≤1 GB warm; 10 GB cold. Out of memory: one capped attempt.
- Data
- Generated analytics CSV. All 1064 raw runs (plus load-first) · csvlite-only benchmarks
All four tools · vs Polars · vs DuckDB