Python实现大文件首列相同值匹配及次列求和的高效方案咨询
问题根源
你当前使用的双层循环时间复杂度为O(n*m),两个1000万条目的列表匹配需要执行1e14次对比,这是运行耗时极长、甚至崩溃的核心原因。
优化方案(无第三方依赖,性能最优)
核心思路是利用Python字典的O(1)查找特性,将其中一个文件的第一列和第二列存为键值对映射,仅需两次线性遍历即可完成匹配,时间复杂度降至O(n+m),内存占用也降低一半。
完整代码如下:
# 读取第一个文件,构建id到数值的映射字典 ch1_map = {} with open('ch1.txt', 'r') as file: for line in file: if ':' not in line: key, val = line.split() ch1_map[key] = int(val) coin = [] # 读取第二个文件,直接匹配字典中是否存在对应id with open('ch2.txt', 'r') as file: for line in file: if ':' not in line: key, val = line.split() if key in ch1_map: coin.append(ch1_map[key] + int(val))
优化点说明
- 无需同时将两个文件全量存入列表,内存占用直接降低50%,400M文件对应的字典内存占用仅约1G,普通设备可正常运行
- 1000万条数据的处理耗时可控制在几十秒内,远低于原方案
- 仅使用只读模式
r打开文件,不需要读写模式r+,性能更优
可选方案(需要pandas,代码更简洁)
如果设备内存充足(剩余内存≥3G),可使用pandas快速实现:
import pandas as pd # 读取两个文件,过滤含冒号的行 df1 = pd.read_csv('ch1.txt', sep=' ', header=None, names=['id', 'v1'], dtype={'id': str, 'v1': int}) df1 = df1[~df1['id'].str.contains(':')] df2 = pd.read_csv('ch2.txt', sep=' ', header=None, names=['id', 'v2'], dtype={'id': str, 'v2': int}) df2 = df2[~df2['id'].str.contains(':')] # 按id匹配后求和 merge_df = pd.merge(df1, df2, on='id', how='inner') coin = (merge_df['v1'] + merge_df['v2']).tolist()
内容的提问来源于stack exchange,提问作者Allentro
相关产品推荐
相关产品推荐

