如何快速校验列表值是否匹配十万行级文件第4列并输出指定结果
性能问题原因分析
- 时间复杂度过高:原代码使用
my_number in row3_list判断,列表的in操作是O(n)线性复杂度,累计遍历次数达到10万*10万=10^10次量级,是速度极慢的核心原因 - 循环逻辑冗余:每读取一行就完整遍历一次
my_list,额外增加了不必要的循环开销 - 业务逻辑错误:原代码会在遍历过程中重复添加大量无效的
unknown记录,完全不符合需求要求,也额外消耗了内存和计算资源
优化实现方案
优化思路是仅遍历文件1次,配合O(1)复杂度的集合匹配完成需求,总时间复杂度为O(N)(N为文件行数),10万条记录几秒内即可完成处理。
import csv my_file = "你的tsv文件路径" my_list = ['140', '700', '800'] # 待匹配列表转集合,in判断为O(1)复杂度 my_set = set(my_list) new_list = [] # 记录已命中的待匹配值 matched_values = set() with open(my_file, 'r', encoding='utf-8') as f: reader = csv.reader(f, delimiter='\t') for row in reader: # 跳过不规范行避免索引报错 if not row or len(row) < 4: continue col4 = row[3] if col4 in my_set: new_list.append(row) matched_values.add(col4) # 补全未匹配到的unknown记录 for val in my_list: if val not in matched_values: new_list.append(['unknown', 'unknown', 'unknown', val])
如果需要输出为制表符分隔的文件,可追加以下代码:
with open("输出文件路径.tsv", 'w', encoding='utf-8', newline='') as f: writer = csv.writer(f, delimiter='\t') writer.writerows(new_list)
运行后输出结果和你给出的期望示例完全一致。
内容的提问来源于stack exchange,提问作者Al-Andalus
相关产品推荐
相关产品推荐

