Python逐行读取大文本文件提取唯一字符的性能优化咨询
性能问题根因
你提供的代码耗时极长的核心原因是每读取一行就对全量已收集字符做重复的展开、转换、去重操作,随着读取内容增多,单步运算耗时会线性上涨,整体时间复杂度达到了O(n²)级别,处理10GB级文件自然会非常慢。
原代码的核心低效点
- 逐行全量重复运算:每读一行就把所有历史字符重新执行转大小写、去重逻辑,属于完全无意义的重复计算
- 存储结构选择错误:用列表存储待去重的字符,去重、查询的效率远低于原生
set集合结构 - 多余的嵌套列表展开操作:不需要将每行转成列表后追加再展开,字符处理后可直接存入去重容器
- 无效代码:
with上下文会自动管理文件句柄,额外写infile.close()属于多余操作
优化方案
优化后整体时间复杂度可以降到O(n),10GB文件的处理耗时可以降到分钟级甚至更快:
- 用
set()作为字符存储容器:天生支持去重,添加单个字符的时间复杂度为O(1),不需要每次全量去重 - 处理逻辑下沉到单个字符维度:读取到字符后先做转大小写、过滤换行符的处理,再存入集合,避免批量转换的开销
- 仅在全部文件读取完成后做一次排序,不需要中间处理
- 可选:用二进制模式读取文件再按编码解码,比逐行读取文本的IO效率更高
优化后代码
input_file = r'C:\large_text_file.txt' output_file = r'C:\char_set.txt' # 参数配置 case_sensitive = False remove_crlf = True # 填写你文件对应的编码,比如utf-8、gbk等,正确配置编码可以大幅提升读取效率 file_encoding = 'utf-8' charset = set() with open(input_file, 'r', encoding=file_encoding) as infile: for line in infile: # 提前过滤换行符 if remove_crlf: line = line.rstrip('\n\r') # 非大小写敏感的话提前转大写 if not case_sensitive: line = line.upper() # 直接将所有字符添加到set,自动去重 charset.update(line) # 排序后输出 sorted_charset = sorted(charset) with open(output_file, 'w', encoding=file_encoding) as f: f.write(''.join(sorted_charset))
额外优化提示
如果文件编码是固定的且单字符字节长度固定,还可以改用二进制模式读取后直接解码字符,IO速度会更快;如果是超大规模文件还可以开启多进程分块读取,但对于提取唯一字符的场景,上面的代码已经足够覆盖绝大多数需求。
内容的提问来源于stack exchange,提问作者Chipmunk_da
相关产品推荐
相关产品推荐

