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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:37:04