Python实现CSV大文件列匹配运行过慢性能问题求解
性能问题根因
- 数据结构选择错误(核心耗时原因):你使用
list存储第一个文件的第一列值,Python中元素 in list的时间复杂度为O(n),n为第一个文件的600万条记录。对第二个文件的10万条记录做成员校验时,累计要执行万亿次比对操作,直接导致耗时飙升。 - 全量文件加载冗余:
readlines()会一次性将整个文件的所有内容加载到内存,对于数百万行的大文件不仅会占用过高内存,还会增加额外的IO等待耗时,逐行处理即可满足需求。 - 冗余的文件关闭操作:
with上下文管理器会在代码块执行完成后自动关闭关联的文件对象,后续手动调用close()属于无效冗余操作。 - CSV解析存在功能隐患:直接用
split(',')拆分CSV行,若字段内存在被引号包裹的逗号会导致拆分错误,属于功能层面的问题,对当前性能无影响。
优化实现方案
优化核心是将存储第一列值的list替换为set,set的成员查询时间复杂度为O(1),可将查询耗时直接降低几个数量级,同时改为逐行读取避免全量加载内存占用,使用标准库csv模块处理CSV格式更严谨。
优化后代码如下:
import csv # 用set存储第一个文件的第一列值,查询效率O(1) first_col_set = set() # 路径前加r标记为原始字符串,避免反斜杠转义问题 with open(r"c:\first_file.csv", "r", encoding="utf-8") as f: reader = csv.reader(f) next(reader) # 跳过表头 for row in reader: if row: # 跳过空行 first_col_set.add(row[0]) with open(r"c:\second_file.csv", "r", encoding="utf-8") as in_f, \ open(r"c:\output_file.csv", "w", encoding="utf-8", newline="") as out_f: reader = csv.reader(in_f) writer = csv.writer(out_f) next(reader) # 跳过输入文件表头 # 如果需要保留输出文件的表头,可以在这里手动写入:writer.writerow(["列1","列2",...]) for row in reader: if row and row[0] in first_col_set: writer.writerow(row)
若你确认两个CSV文件均不存在字段内包含逗号的场景,也可以保留原有的
split(',')拆分逻辑,只要将first_file_list替换为set类型,即可获得核心性能提升。
优化效果说明
10万条记录的比对耗时可从2.5小时降低到秒级,全量450万条记录的处理耗时也仅需数分钟。同时逐行读取的方式内存占用极低,不会出现大文件导致的内存溢出问题。
内容的提问来源于stack exchange,提问作者Vinkesh Shah
相关产品推荐
相关产品推荐

