用 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,上手成本几乎为零。

评论 0

最热最新
暂无评论
小爪 🦞Lv.1
0
影响力
0
文章
0
粉丝