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

Python写入超大规模CSV耗时久是否正常?如何加速?

大规模数组CSV写入的性能优化问题

我有一段代码片段:

import csv
...
    with open(outpath + outname + "_results.csv","w+") as my_csv:
        csvWriter = csv.writer(my_csv, delimiter = '|')
        csvWriter.writerows(zip(
            np.asarray(id_list), 
            np.asarray(ground_truth_list), 
            np.asarray(prediction_list)))

上述三个数组对应带有真实标签和数据ID的机器学习预测结果。该写入功能可用,但格式较差,我们已通过后处理解决。核心问题是:当数组规模达1亿+时,完成CSV写入需数小时,生成文件约3-4GB。请问这种耗时是否合理?能否加速?


耗时是否合理?

1亿条数据生成3-4GB文件,写入耗时数小时确实偏长。机械硬盘连续写入速度通常在100-200MB/s,3GB文件理论写入时间仅15-30分钟;就算算上数据处理开销,正常也不该超过1小时。你的代码存在几个低效点,直接导致了耗时飙升。

加速方案

1. 抛弃逐行处理,用numpy向量化生成文本

zip+writerows是逐行生成数据并写入,Python循环和逐行IO是主要性能瓶颈。直接用numpy的向量化操作生成整批文本再写入,能大幅提升速度:

import numpy as np

# 合并三个数组为二维结构
combined = np.column_stack([id_list, ground_truth_list, prediction_list])
# 一次性生成所有行的文本(用|分隔)
lines = np.apply_along_axis(lambda x: '|'.join(map(str, x)), 1, combined)
# 批量写入文件
with open(outpath + outname + "_results.csv", "w+") as f:
    f.write('\n'.join(lines) + '\n')

2. 增大文件IO缓冲区

默认文件缓冲区较小,频繁IO操作会拖慢速度。手动设置大缓冲区(比如10MB)减少IO次数:

with open(outpath + outname + "_results.csv", "w+", buffering=10*1024*1024) as my_csv:
    # 写入逻辑

3. 用numpy内置方法替代csv模块

numpy的np.savetxt是为数组写入优化的工具,性能远高于Python标准库的csv模块:

np.savetxt(
    outpath + outname + "_results.csv",
    np.column_stack([id_list, ground_truth_list, prediction_list]),
    delimiter='|',
    fmt='%s'  # 根据数据类型调整,整数用%d,浮点数用%f
)

4. 换用更高效的存储格式(可选)

如果后续不需要纯文本CSV,换成Parquet、Feather或numpy的.npy二进制格式,写入速度能快一个数量级,文件体积也更小,后续读取性能也会大幅提升,适合大规模机器学习数据存储。

内容的提问来源于stack exchange,提问作者oliver.c

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 04:52:07