为什么pandas read_csv指定usecols读取少量列速度依然很慢?
问题原因
你猜测的pandas需要先完整读取300万列表头才能筛选列是核心原因之一,除此之外还有更主要的开销:
- 默认C解析引擎需要逐行扫描全部列的分隔符才能确定列边界,哪怕只保留14列,也要完成300行×300万列的分隔符匹配,总扫描次数接近9亿次,这部分是耗时的主要来源
dtype参数仅能优化列数据的类型转换开销,和表头解析、全列扫描的开销相比可以忽略,所以是否指定dtype对总耗时几乎没有影响
优化方案
- 更换解析引擎:pandas 1.4及以上版本可以在
read_csv时添加engine='pyarrow'参数,pyarrow的CSV解析器对超宽表的处理效率远高于默认C引擎,仅这一个改动通常就能把耗时降到10秒以内 - 预定位目标列位置:先单独读取第一行表头,拿到你需要的14列对应的数字索引,把索引列表传给
usecols参数而非列名字符串,可省去后续解析过程中的列名匹配开销 - 手动轻量解析:极端场景下可以直接用Python标准库
csv模块逐行读取,每行仅提取目标索引的14个值后再组装为DataFrame,跳过pandas全列扫描的默认逻辑 - 预处理一劳永逸:如果需要反复读取该文件的指定列,建议第一次读取后把这14列单独存储为Parquet格式,后续读取Parquet文件的耗时通常在10毫秒级别
- 系统工具前置处理:Linux/macOS环境下可以先用
cut等shell命令提前切割出目标列生成小文件,再用pandas读取,shell原生文本处理的切割效率远高于Python层逻辑
内容的提问来源于stack exchange,提问作者SLotreck
相关产品推荐
相关产品推荐

