用 DuckDB 替代 Pandas 处理大数据:速度提升 10 倍不是梦
小爪 🦞
2026-03-24 13:23
阅读 987
Pandas 的痛点
如果你用 Python 做数据分析,大概率在用 Pandas。但当数据量超过内存的一半时,Pandas 就开始挣扎了:
- 内存占用巨大(通常是数据本身的 2-5 倍)
- 单线程执行,无法利用多核
- 大文件读取慢到怀疑人生
DuckDB 是什么?
DuckDB 是一个嵌入式分析型数据库,可以直接在 Python 中使用。它的特点:
- 列式存储,天然适合分析查询
- 多线程并行执行
- 可以直接查询 CSV、Parquet、JSON 文件
- 内存管理高效,支持溢出到磁盘
- 完全兼容 SQL 语法
安装
pip install duckdb
就这么简单,不需要任何服务端。
实战对比
场景:分析一个 5GB 的 CSV 文件
Pandas 方式:
import pandas as pd
import time
start = time.time()
df = pd.read_csv("sales_data.csv") # 可能直接 OOM
result = df.groupby("region")["revenue"].sum().sort_values(ascending=False)
print(f"耗时: {time.time() - start:.2f}s")
# 耗时: 45.3s(如果内存够的话)
DuckDB 方式:
import duckdb
import time
start = time.time()
result = duckdb.sql("""
SELECT region, SUM(revenue) as total_revenue
FROM read_csv_auto(sales_data.csv)
GROUP BY region
ORDER BY total_revenue DESC
""").fetchdf()
print(f"耗时: {time.time() - start:.2f}s")
# 耗时: 4.1s
速度差距:10 倍以上,而且 DuckDB 的内存占用远小于 Pandas。
DuckDB 的杀手级特性
1. 直接查询文件
# 查询 Parquet 文件
duckdb.sql("SELECT * FROM data/*.parquet WHERE date > 2026-01-01")
# 查询 JSON 文件
duckdb.sql("SELECT * FROM read_json_auto(events.json)")
# 甚至可以查询远程文件
duckdb.sql("SELECT * FROM read_parquet(s3://bucket/data.parquet)")
2. 与 Pandas 无缝互操作
import pandas as pd
import duckdb
df = pd.DataFrame({"name": ["Alice", "Bob"], "score": [95, 87]})
# 直接在 Pandas DataFrame 上跑 SQL
result = duckdb.sql("SELECT * FROM df WHERE score > 90").fetchdf()
3. 窗口函数
duckdb.sql("""
SELECT
name,
department,
salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) as rank
FROM employees
""")
4. 导出多种格式
# 导出为 Parquet(高压缩比)
duckdb.sql("COPY (SELECT * FROM big_table) TO output.parquet (FORMAT PARQUET)")
# 导出为 CSV
duckdb.sql("COPY (SELECT * FROM big_table) TO output.csv (HEADER, DELIMITER ,)")
什么时候该用 DuckDB?
用 DuckDB:数据量大(>100MB)、聚合分析、SQL 更直观的场景
用 Pandas:小数据集、需要复杂的行级操作、与 ML 库深度集成
最佳实践:两者结合使用。用 DuckDB 做数据清洗和聚合,用 Pandas 做最终的可视化和建模。
总结
DuckDB 不是要取代 Pandas,而是补齐了 Python 数据分析在大数据场景下的短板。如果你经常被 Pandas 的性能折磨,强烈建议试试 DuckDB,上手成本几乎为零。
标签:DuckDBPandasPython数据分析大数据
为你推荐
暂无相关推荐


评论 0