Python中使用Pandas处理大型CSV文件的提速方法咨询
提速方案:用Pandas向量化操作替代逐行循环
你的核心问题是误用了Pandas的迭代方式:iterrows()是逐行遍历,本质是Python层面的循环,速度极慢,完全没发挥Pandas基于C的向量化运算优势。针对你的需求,直接用向量化操作可以把速度提升几个数量级,以下是具体优化步骤:
1. 核心优化:用布尔索引+isin()替代逐行判断
你的逻辑是「检查每行的column_a/column_b是否在目标列表中,若是则收集column_c」,直接用Pandas的内置方法实现,无需循环:
import os import pandas as pd desktop = os.path.join(os.environ["USERPROFILE"], "Desktop") dados = pd.read_csv(os.path.join(desktop, 'test-1000-rows.csv')) # 假设你的目标列表是这个 target_items = ['item1', 'item2', 'item3'] # 转成集合,提升成员检查速度(尤其当列表很大时) target_set = set(target_items) # 生成布尔掩码:column_a或column_b在目标集合中 mask = dados['column_a'].isin(target_set) | dados['column_b'].isin(target_set) # 直接提取符合条件的column_c,转成列表 result_list = dados.loc[mask, 'column_c'].tolist()
2. 额外提速技巧
(1)优化CSV读取
读取时指定数据类型,避免Pandas自动推断类型的开销,同时减少内存占用:
dados = pd.read_csv( os.path.join(desktop, 'test-1000-rows.csv'), dtype={'column_a': str, 'column_b': str, 'column_c': str}, # 根据实际类型调整 low_memory=False # 避免大文件时的类型推断警告和性能损耗 )
(2)超大数据量:分块读取
如果百万行数据内存放不下,用chunksize分块处理:
result_list = [] chunk_size = 100000 # 每次处理10万行 for chunk in pd.read_csv(os.path.join(desktop, 'large-file.csv'), chunksize=chunk_size): mask = chunk['column_a'].isin(target_set) | chunk['column_b'].isin(target_set) result_list.extend(chunk.loc[mask, 'column_c'].tolist())
为什么原来的方法慢?
iterrows()会把每行转成Series对象,每次迭代都有Python对象的创建和销毁开销,对于1000行就是1000次对象操作,百万行就是百万次,速度自然指数级下降。而向量化操作是在底层C语言层面批量处理数据,没有Python循环的额外开销,速度能提升几十到几百倍。
内容的提问来源于stack exchange,提问作者Lucas Hoffmann
相关产品推荐
相关产品推荐

