如何将数据存入Python dictionary以减少大文本文件重复处理耗时
优化方案
核心思路
一次性读取整个10万行文件,将前50000行的检索关键字与关联数据提前存入Python字典,利用字典O(1)的查询特性,后续遍历后50000行时直接匹配查询,全程只需要读取文件1次。
具体实现步骤
- 第一步:一次性读取文件所有行,避免重复IO操作
10万行文本体积通常不超过百兆,完全可以全部加载到内存,无需逐次打开文件 - 第二步:构造前半段内容的查询字典
把前50000行中需要用来匹配的字段作为字典的key,该行需要提取的关联数据作为value,如果存在多行对应同一个key的场景,可以把value设为列表存储多条关联数据 - 第三步:遍历后半段内容直接查询字典
遍历第50001到100000行,提取待匹配的内容直接去字典中查询,存在就直接取出对应的关联数据即可
代码示例
# 替换为你的实际文件路径 file_path = "your_text_file.txt" # 自定义关键字和关联数据的提取规则,可根据你的文本格式修改 def extract_key_value(line): # 示例假设文本为制表符分隔,第一列为检索关键字,第二列为需要提取的关联数据 parts = line.strip().split("\t") match_key = parts[0] related_data = parts[1] return match_key, related_data if __name__ == "__main__": # 仅读取1次文件,加载所有行到内存 with open(file_path, "r", encoding="utf-8") as f: all_lines = f.readlines() # 按索引拆分前后半段,Python索引从0开始,前5万行对应索引0~49999,后5万行对应50000~99999 first_half = all_lines[:50000] second_half = all_lines[50000:] # 构建查询字典 query_dict = {} for line in first_half: line = line.strip() if not line: continue key, value = extract_key_value(line) if key not in query_dict: query_dict[key] = [] # 同关键字多数据场景用列表存储 query_dict[key].append(value) # 遍历后半段直接查询字典 result = [] for line in second_half: line = line.strip() if not line: continue match_key, _ = extract_key_value(line) if match_key in query_dict: result.extend(query_dict[match_key]) # 后续可直接处理查询结果 print(result)
优化效果说明
- 原有循环打开文件检索的方案时间复杂度为O(M*N),M、N分别为前后半段行数,最坏情况下需要执行25亿次匹配操作
- 优化后方案时间复杂度为O(M+N),总共仅需要遍历10万次,加上字典查询几乎无额外消耗,耗时会降至原有方案的几十分之一甚至更低
- 内存占用极低,10万行文本全部加载到内存仅占几十MB,不会有内存压力
内容的提问来源于stack exchange,提问作者maheshbabukondaveeti
相关产品推荐
相关产品推荐

