NumPy的loadtxt因纯Python逐行解析且不支持分块与类型推断,读取大型CSV速度非常慢。改用pandas的read_csv的C引擎可提速数倍至数十倍。对于超大文件,建议先转换为二进制格式,再通过NumPy的memmap加载,可避免重复解析开销。这些优化措施可显著提升性能。
先说结论:numpy.loadtxt 读取大型 CSV 文件时速度缓慢甚至无响应,根本原因在于它是纯 Python 实现的文本解析器——逐行扫描、类型推断、内存预分配全部依赖解释器执行,底层没有任何优化。100MB 以上的 CSV 文件已经明显变慢,500MB+ 的文件很可能直接导致内存溢出(OOM)或卡死几分钟。
它默认将整张表一次性加载到内存中,而且不支持分块处理、跳过列、指定 dtype——即便你只需要第 3 列,它也必须逐行解析所有字段。更麻烦的是,它还存在几个明显的限制:
长期稳定更新的攒劲资源: >>>点此立即查看<<<
nan 处理逻辑较重)max_rows 是 NumPy 1.23+ 才新增的参数,旧版本没有)
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)
NumPy 本身不擅长 I/O 操作,这是 Pandas 的优势所在。Pandas 底层使用 C 语言解析(libc + csv-parser),支持多线程、内存映射、分块处理,且类型推断更智能。
不要直接转成列表再传入 np.array(),那样会丢失零拷贝优势:
pd.read_csv(..., dtype={"col1": "float32"}) 控制列类型engine="c"(默认就是 C 引擎,但显式指定更可靠)df.to_numpy(dtype="float32"),而不是 np.array(df)chunksize=10000 分批处理,避免内存峰值当文件大到连 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 严格一致。字段顺序、字节序、空值编码,只要有一处不对,整个数据就会崩溃。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述