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

如何用Python Pandas高效加载Parquet文件列表?

Pandas加载Parquet文件的性能差异分析与优化技巧

一、pd.read_parquet("/path/to/directory/")提速的核心原理

直接读取目录时,Pandas依赖的底层Parquet引擎(PyArrow或FastParquet)会做以下关键优化:

  • 批量元数据扫描:一次性遍历目录下所有文件,统一读取schema、分区等元数据,避免了逐个文件读取元数据的重复开销。
  • 并行化处理:引擎会自动启用多线程/进程并行加载文件,充分利用CPU和IO资源;而列表推导式逐个读取是单线程执行,完全没用到并行能力。
  • 减少内存拷贝:批量读取可以直接将所有文件的数据合并为一个完整的DataFrame,避免了逐个读取后pd.concat带来的多次内存分配、扩容和数据拷贝操作。

二、优化pd.concat([pd.read_parquet(i) for i in filelist])的技巧

要让第二种方法接近第一种的性能,可以从以下几个方向入手:

1. 直接给pd.read_parquet传入过滤后的文件列表(推荐)

Pandas 1.5.0+版本支持直接向pd.read_parquet传入文件列表,底层会调用引擎的批量读取逻辑,和直接读目录的性能一致:

import glob
import pandas as pd

filelist = glob.glob("/path/to/directory/*")
# 自定义过滤逻辑,比如只保留包含特定关键词的文件
filtered_files = [f for f in filelist if "2023" in f]
df = pd.read_parquet(filtered_files)

如果需要从多个目录加载,只需把不同目录的文件合并到同一个列表中即可。

2. 用底层引擎的批量读取接口

如果使用PyArrow引擎,直接调用pyarrow.parquet.read_table传入文件列表,再转换为Pandas DataFrame,性能会更优:

import glob
import pyarrow.parquet as pq
from pyarrow import pandas as pa_pd

filelist = glob.glob("/path/to/directory/*")
filtered_files = [f for f in filelist if ...]  # 你的过滤条件
table = pq.read_table(filtered_files)
df = pa_pd.to_pandas(table)

这种方式完全复用了引擎的并行优化,和直接读目录的性能几乎无差异。

3. 并行化读取单个文件

如果必须逐个处理文件(比如每个文件需要自定义读取逻辑),可以用线程池实现并行读取:

import glob
import pandas as pd
from concurrent.futures import ThreadPoolExecutor

def read_parquet_file(file_path):
    # 这里可以添加自定义逻辑,比如特定列读取、过滤等
    return pd.read_parquet(file_path, columns=["col1", "col2"])

filelist = glob.glob("/path/to/directory/*")
filtered_files = [f for f in filelist if ...]

with ThreadPoolExecutor(max_workers=4) as executor:
    dfs = list(executor.map(read_parquet_file, filtered_files))

df = pd.concat(dfs, ignore_index=True)

Parquet读取属于IO密集型任务,线程池足够提升效率;如果是CPU密集型的自定义处理,可以改用ProcessPoolExecutor。

4. 利用分区路径预过滤

如果你的Parquet文件是按目录分区存储的(比如/data/year=2023/month=10/),直接通过路径过滤分区文件,比全量读取后过滤更高效:

import pandas as pd
import glob

# 只加载2023年10月的所有Parquet文件
filtered_files = glob.glob("/path/to/directory/year=2023/month=10/*")
df = pd.read_parquet(filtered_files)

这种方式从源头减少了需要加载的文件数量,性能提升最为显著。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:37:25