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

Python实现CSV大文件列匹配运行过慢性能问题求解

性能问题根因
  • 数据结构选择错误(核心耗时原因):你使用list存储第一个文件的第一列值,Python中元素 in list的时间复杂度为O(n),n为第一个文件的600万条记录。对第二个文件的10万条记录做成员校验时,累计要执行万亿次比对操作,直接导致耗时飙升。
  • 全量文件加载冗余:readlines()会一次性将整个文件的所有内容加载到内存,对于数百万行的大文件不仅会占用过高内存,还会增加额外的IO等待耗时,逐行处理即可满足需求。
  • 冗余的文件关闭操作:with上下文管理器会在代码块执行完成后自动关闭关联的文件对象,后续手动调用close()属于无效冗余操作。
  • CSV解析存在功能隐患:直接用split(',')拆分CSV行,若字段内存在被引号包裹的逗号会导致拆分错误,属于功能层面的问题,对当前性能无影响。
优化实现方案

优化核心是将存储第一列值的list替换为set,set的成员查询时间复杂度为O(1),可将查询耗时直接降低几个数量级,同时改为逐行读取避免全量加载内存占用,使用标准库csv模块处理CSV格式更严谨。

优化后代码如下:

import csv

# 用set存储第一个文件的第一列值,查询效率O(1)
first_col_set = set()
# 路径前加r标记为原始字符串,避免反斜杠转义问题
with open(r"c:\first_file.csv", "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    next(reader)  # 跳过表头
    for row in reader:
        if row:  # 跳过空行
            first_col_set.add(row[0])

with open(r"c:\second_file.csv", "r", encoding="utf-8") as in_f, \
     open(r"c:\output_file.csv", "w", encoding="utf-8", newline="") as out_f:
    reader = csv.reader(in_f)
    writer = csv.writer(out_f)
    next(reader)  # 跳过输入文件表头
    # 如果需要保留输出文件的表头,可以在这里手动写入:writer.writerow(["列1","列2",...])
    for row in reader:
        if row and row[0] in first_col_set:
            writer.writerow(row)

若你确认两个CSV文件均不存在字段内包含逗号的场景,也可以保留原有的split(',')拆分逻辑,只要将first_file_list替换为set类型,即可获得核心性能提升。

优化效果说明

10万条记录的比对耗时可从2.5小时降低到秒级,全量450万条记录的处理耗时也仅需数分钟。同时逐行读取的方式内存占用极低,不会出现大文件导致的内存溢出问题。

内容的提问来源于stack exchange,提问作者Vinkesh Shah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:00:04