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

