如何优化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
相关产品推荐
相关产品推荐

