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

Polars对比Pandas:Parquet数据过滤为何Polars更慢?

Polars处理Parquet过滤速度慢于Pandas的原因与优化方法

问题背景

有一个约1.5GB的Parquet文件,处理后得到250k行、10列的数据集,其中content列存储1-20页的大段文本。测试Polars与Pandas的过滤性能时发现:

Polars测试代码与耗时

import polars as pl

df = (pl.scan_parquet("folder/myfile.parquet")
      .filter((pl.col("type")=="Urteil") | (pl.col("type")=="Beschluss"))
      .collect()
     )
df.head()
  • 全流程耗时约1分钟,仅过滤步骤耗时约13秒

Pandas测试代码与耗时

import pandas as pd 

df = (pd.read_parquet("folder/myfile.parquet")
    .query("type == 'Urteil' | type == 'Beschluss'") )
df.head()
  • 全流程耗时约1分钟,仅查询步骤耗时不到1秒

数据集列类型:

  • i64
  • str
  • struct[7]
  • 其余均为str

原因分析

  1. 执行逻辑差异
    Pandas是先将整个Parquet文件全量读入内存,再执行过滤操作——这一步过滤是纯内存计算,所以耗时极短,但全流程的1分钟主要花在了读取大文本列的IO上。
    Polars的scan_parquet采用懒加载模式,过滤时需要先扫描文件中type列的数据来筛选符合条件的行,再读取对应行的所有列数据。如果Parquet文件没有针对type列做优化(比如分区、统计信息),Polars需要先读取type列的全部数据做判断,这部分额外的IO导致过滤步骤耗时更长,但全流程耗时和Pandas相近,说明核心瓶颈都是大文本列的IO开销。

  2. 大文本列的影响
    content列的大段文本占了文件的大部分体积,无论是Polars还是Pandas,读取这部分数据都需要大量IO时间,这是全流程耗时的主要原因。

优化方法

1. 只读取必要列

在扫描Parquet时指定需要的列,避免读取暂时用不到的大文本列,减少IO量:

# 方法1:先过滤,仅读取非content列,后续按需读取content
filtered_meta = (pl.scan_parquet("folder/myfile.parquet", columns=["type", "id", ...]) # 列出需要的非文本列
                 .filter((pl.col("type")=="Urteil") | (pl.col("type")=="Beschluss"))
                 .collect()
                )

# 方法2:直接指定所有需要的列(包括content),避免读取冗余列
df = (pl.scan_parquet("folder/myfile.parquet", columns=["type", "content", "id", ...])
      .filter((pl.col("type")=="Urteil") | (pl.col("type")=="Beschluss"))
      .collect()
     )

这种方式能大幅减少IO开销,是最有效的提速手段。

2. 优化Parquet文件结构

如果可以重新生成Parquet文件:

  • 按type列分区存储:这样Polars过滤时可以直接跳过不需要的分区,无需扫描整个文件。
  • 添加统计信息(如Bloom Filter):生成Parquet时配置统计信息,Polars可以更快判断哪些行符合过滤条件,减少不必要的IO。

3. 调整Polars读取参数

  • 确认使用engine="pyarrow"(Polars默认使用pyarrow,性能更稳定)
  • 内存充足时设置low_memory=False,减少内存调度开销
  • 调整batch_size参数,匹配你的内存和IO能力

4. 后续文本预处理利用Polars优势

虽然过滤阶段可能暂时没优势,但Polars的矢量化字符串操作(如pl.col("content").str.replace()、pl.col("content").str.split()等)性能远优于Pandas,后续处理大文本时能显著节省时间。

总结

你的操作没有错误,只是两者执行逻辑的差异导致过滤步骤耗时不同,但全流程的核心瓶颈都是大文本列的IO。通过只读取必要列、优化Parquet文件结构等手段,能大幅提升Polars的处理速度,后续文本预处理阶段还能进一步发挥Polars的性能优势。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:11:10