You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Polars write_parquet导出性能远低于PyArrow/Pandas,是否正常?

Polars导出Parquet性能远低于PyArrow/Pandas的原因及解决办法

问题重现

测试环境:

  • pandas 1.5.3
  • polars 0.20.9
  • Windows系统

测试代码及结果:

import polars as pl 
import pandas as pd
import time

data = {'id' : ['abcdefgh'*6] * 3_000_000,
        'code' : ['20032'] * 3_000_000}

# Polars原生导出
df = pl.DataFrame(data)
start = time.time()
df.write_parquet("try.parquet", use_pyarrow=False)
stop = time.time()
print(stop - start) # 13.43877625465393

# Polars使用PyArrow导出
start = time.time()
df.write_parquet("try.parquet", use_pyarrow=True)
stop = time.time()
print(stop - start) # 0.3627772331237793

# Pandas导出
df = pd.DataFrame(data)
start = time.time()
df.to_parquet("try.parquet")
stop = time.time()
print(stop - start) # 1.3980333805084229

原因分析

你遇到的现象是正常的,核心原因在于Polars 0.20.9版本的原生Parquet Writer在处理高度重复的长字符串数据时,编码优化不足:

  • PyArrow的Parquet writer会自动对重复率极高的字符串列启用字典编码,大幅降低数据体积并提升写入速度
  • Polars旧版本的原生writer默认没有针对这类场景做优化,导致重复字符串的写入效率远低于PyArrow

解决办法

  1. 优先使用use_pyarrow=True参数:从测试结果看,Polars调用PyArrow导出的速度已经比Pandas快3倍以上,完全满足性能需求,这是当前最直接的解决方案
  2. 升级Polars版本:Polars后续版本(如0.21+)对原生Parquet Writer做了大量优化,包括对重复字符串的编码支持,升级后原生导出性能会显著提升
  3. 手动指定编码策略:如果坚持使用原生导出,可以手动为字符串列指定字典编码,示例代码:
df.write_parquet(
    "try.parquet",
    use_pyarrow=False,
    compression="snappy",
    encoding={"id": "dict", "code": "dict"}
)

内容的提问来源于stack exchange,提问作者Nugliar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 23:29:53