首页 > 编程语言 >如何解决Python NumPy读取大型CSV文件速度慢?

如何解决Python NumPy读取大型CSV文件速度慢?

来源:互联网 2026-07-13 07:59:11

NumPy的loadtxt因纯Python逐行解析且不支持分块与类型推断,读取大型CSV速度非常慢。改用pandas的read_csv的C引擎可提速数倍至数十倍。对于超大文件,建议先转换为二进制格式,再通过NumPy的memmap加载,可避免重复解析开销。这些优化措施可显著提升性能。

为什么 numpy.loadtxt 读大 CSV 会卡住?

先说结论:numpy.loadtxt 读取大型 CSV 文件时速度缓慢甚至无响应,根本原因在于它是纯 Python 实现的文本解析器——逐行扫描、类型推断、内存预分配全部依赖解释器执行,底层没有任何优化。100MB 以上的 CSV 文件已经明显变慢,500MB+ 的文件很可能直接导致内存溢出(OOM)或卡死几分钟。

它默认将整张表一次性加载到内存中,而且不支持分块处理、跳过列、指定 dtype——即便你只需要第 3 列,它也必须逐行解析所有字段。更麻烦的是,它还存在几个明显的限制:

长期稳定更新的攒劲资源: >>>点此立即查看<<<

  • 不支持缺失值快速跳过(nan 处理逻辑较重)
  • 不能跳过注释行以外的任意行(例如 header 之后还有统计行)
  • 无法限制读取行数用于调试(max_rows 是 NumPy 1.23+ 才新增的参数,旧版本没有)
如何解决Python NumPy读取大型CSV文件速度慢?

用 numpy.genfromtxt 也没快多少?试试这些参数

genfromtxt 虽然比 loadtxt 灵活性更高,但默认行为依然保守。关键不在于换函数,而是关闭它“过度负责”的部分:

  • 显式传入 dtype,比如 dtype="float32",避免自动类型推断的开销
  • 设置 skip_header=1 而非依赖 comments="#" 逐行判断
  • 使用 usecols=(0, 2, 4) 只加载需要的列,跳过字符串列或 ID 列
  • 添加 invalid_raise=False 避免遇到坏数据时中断并重试

示例:

np.genfromtxt("data.csv", delimiter=",", dtype="float32", usecols=(1,3), skip_header=1)

真正提速:改用 pandas.read_csv + to_numpy()

NumPy 本身不擅长 I/O 操作,这是 Pandas 的优势所在。Pandas 底层使用 C 语言解析(libc + csv-parser),支持多线程、内存映射、分块处理,且类型推断更智能。

不要直接转成列表再传入 np.array(),那样会丢失零拷贝优势:

  • 使用 pd.read_csv(..., dtype={"col1": "float32"}) 控制列类型
  • 添加 engine="c"(默认就是 C 引擎,但显式指定更可靠)
  • 需要纯 NumPy 数组时,直接调用 df.to_numpy(dtype="float32"),而不是 np.array(df)
  • 超大文件可配合 chunksize=10000 分批处理,避免内存峰值

极端场景:内存不够?试试 numpy.memmap + 自定义 parser

当文件大到连 Pandas 都无法处理(例如超过 20GB),又必须使用 NumPy 原生接口时,memmap 是唯一可行的路径——但它不支持 CSV,只识别二进制格式。

做法是先用 Pandas 或 Dask 将 CSV 转换为紧凑的 .npy.bin 文件(例如 float32 连续存储),再用 np.memmap 加载:

arr = np.memmap("data.bin", dtype="float32", mode="r", shape=(10_000_000, 5))

注意:memmap 不会自动处理 CSV 的行列对齐、缺失值、类型混合——这些必须在转换阶段完成,漏掉一步,后续读取结果全是错的。

真正的难点不在于读取,而在于确保二进制格式与原始 CSV 的 schema 严格一致。字段顺序、字节序、空值编码,只要有一处不对,整个数据就会崩溃。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。