为何R的fread读取超大型CSV比Python Pandas read_csv更快?
为什么R的data.table::fread读取超大CSV比Python Pandas的read_csv快?
你遇到的情况很正常,不是Python整体比R慢,而是fread和默认配置的read_csv在CSV解析的底层优化上差距很大,具体原因可以拆解为这几点:
1. fread的底层优化针对性极强
fread是data.table团队用C++从零实现的CSV解析器,专门针对大文件做了极致优化:
- 用**内存映射(memory mapping)**直接把文件映射到进程内存,跳过了传统IO的磁盘-内核-用户空间多轮拷贝,大文件下IO开销锐减
- 解析逻辑是流水线式的:一边检测分隔符/数据类型,一边加载数据,不需要先全量扫描文件再解析,类型推断效率远高于Pandas默认逻辑
- 自动跳过空行、注释行,处理不规则CSV的逻辑更高效,不会因小格式问题拖慢速度
2. Pandas read_csv默认配置没拉满性能
Pandas的read_csv默认用的是老版C解析器(或纯Python解析器,取决于版本),且默认做了不少额外操作:
- 默认自动生成整数索引,对1亿行的大文件来说,这部分额外的内存分配和写入会消耗不少时间
- 数据类型推断逻辑更保守,会分块扫描文件确认类型,容易出现重复扫描的情况
- 默认未启用内存映射,IO操作开销比fread大很多
给Pandas提速的实用方法
如果想用Pandas达到接近fread的速度,可以试试这些参数:
- 用pyarrow引擎(Pandas 1.4+支持):
import pandas as pd df = pd.read_csv("filename.csv", engine="pyarrow")
pyarrow的解析器专为大数据优化,速度比默认引擎快2-3倍
- 提前指定数据类型(
dtype参数),避免Pandas做耗时的类型推断:
# 示例:指定部分列的类型 dtype_dict = {"col1": "int32", "col2": "float32", "col3": "category"} df = pd.read_csv("filename.csv", dtype=dtype_dict, engine="pyarrow")
- 只读取需要的列(
usecols参数),减少加载的数据量:
df = pd.read_csv("filename.csv", usecols=["col1", "col3", "col5"], engine="pyarrow")
- 关闭分块类型推断:
low_memory=False,避免因分块扫描导致的重复工作
你提供的原始代码
Python代码:
import pandas as pd df = pd.read_csv("filename.csv")
R代码:
library(data.table) df <- fread("filename.csv")
内容的提问来源于stack exchange,提问作者Ritwik Bandyopadhyay
相关产品推荐
相关产品推荐

