Python批量连续创建写入文件速度变慢问题求助
优化多文件批量写入速度的思路
核心问题定位
你的代码最大的性能瓶颈不是磁盘IO(所以HDD和SSD耗时一致),而是重复遍历原始数据lines——每处理一个文件就完整遍历一次lines,文件越多,重复计算的开销呈线性增长,CPU和内存的消耗远远盖过了磁盘写入的差异。
具体优化方案
1. 一次遍历,分发数据(最关键优化)
把遍历逻辑反转:只遍历一次lines,将每条数据直接分发到对应文件的缓存中,最后统一写入所有文件。这样不管有多少文件,都只扫一遍原始数据,直接砍掉N倍的遍历开销。
2. 用列表替代字符串拼接
Python的字符串是不可变对象,file_cache += l + "\n"每次都会生成新字符串,大数据量下会产生大量临时对象,内存和CPU开销极大。改用列表存储每行内容,最后用'\n'.join()拼接,效率提升非常明显。
3. 可选:分批次写入(避免内存过载)
如果单文件缓存过大(比如单文件要写几百万行),可以在分发数据时设置阈值,缓存达到一定行数就写入一次磁盘,清空缓存后继续,避免内存占用过高触发系统交换(swap)拖慢速度。
优化后的示例代码
# 初始化每个文件的缓存容器(用列表存,比字符串高效) file_caches = {fname: [] for fname in file_names} # 仅遍历一次原始数据,分发到对应文件缓存 for line in lines: if condition: # 将line加入对应文件的缓存列表 file_caches["target_file_1"].append(line) elif condition_2: file_caches["target_file_2"].append(line) # 其他匹配条件... # 统一写入所有文件 for fname, cache_lines in file_caches.items(): with open(fname, "w") as f: # 用join拼接列表,生成完整内容后写入 f.write("\n".join(cache_lines) + "\n") # 末尾加换行保证文件格式统一
额外小技巧
- 简化条件判断:如果条件逻辑复杂,可以提前用字典映射规则(比如
condition_map = {key: fname, ...}),减少分支判断的开销。 - 调整文件缓冲区:打开文件时指定
buffering参数(比如buffering=1024*1024,即1MB缓冲区),让系统批量写入磁盘,减少IO调用次数。
内容的提问来源于stack exchange,提问作者Hope
相关产品推荐
相关产品推荐

