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
相关产品推荐
相关产品推荐

