You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:09:04