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

如何优化Python批量文件重命名代码以提升运行速度?

批量重命名文件的性能优化方案

核心问题分析

你的代码性能瓶颈在于双重嵌套循环:遍历字典的每个键值对时,都要完整遍历一次文件夹内的4000个文件。假设字典有M个条目,总操作次数就是M×4000次,这会随着字典规模增大急剧拖慢速度。

具体优化方法

  • 颠倒循环逻辑,减少遍历次数
    改为先遍历所有文件(仅4000次),再对每个文件名匹配对应的蛋白名并替换成基因名,总操作次数直接降到4000次。同时利用文件名的固定格式000_PROTEINNAME_...,精准提取蛋白名部分,避免全字符串匹配的冗余。

  • 优化路径拼接方式
    用os.path.join()替代手动字符串拼接,既提升跨平台兼容性,也减少字符串操作的开销。

  • 提前缓存文件列表
    一次性读取文件夹内的所有文件名并缓存,避免重复调用os.listdir()带来的系统调用开销。

优化后的代码

import csv
import os
import re

def RenameAlphaFold(files_path, reference_table_path):
    # 构建蛋白名到基因名的映射字典
    names = {}
    with open(reference_table_path, 'r') as f:
        tsv_reader = csv.reader(f, delimiter='\t')
        # 若TSV有表头,取消注释下面一行跳过表头
        # next(tsv_reader)
        for line in tsv_reader:
            protein_name = line[2]
            gene_name = line[5]
            names[protein_name] = gene_name
    
    # 预编译正则表达式,匹配文件名中的蛋白名部分
    pattern = re.compile(r'(\d+)_([^_]+)_(.+)')
    
    # 一次性读取所有文件列表
    file_list = os.listdir(files_path)
    
    for file in file_list:
        match = pattern.match(file)
        if match:
            prefix, protein_name, suffix = match.groups()
            if protein_name in names:
                gene_name = names[protein_name]
                new_file_name = f"{prefix}_{gene_name}_{suffix}"
                source = os.path.join(files_path, file)
                destination = os.path.join(files_path, new_file_name)
                os.rename(source, destination)

额外优化建议

  • 如果字典规模很大,可以先把蛋白名存入集合,先判断文件名中的蛋白名是否存在于集合中,再进行替换(Python字典查找本身是O(1),此优化收益有限,但可减少无效查找的判断逻辑)。
  • 若需处理超大量文件,可尝试多线程,但注意os.rename()是系统调用,多线程收益可能不明显,反而可能引发竞争问题,需谨慎使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:05:09