寻求高效查找指定子文件夹的Python优化方案
大数量文件夹扫描的优化方案
原代码的性能瓶颈
- 原代码通过
os.listdir()遍历后,对每个条目调用os.path.isdir(),每个调用都会触发一次独立的系统I/O操作,在30万级别的文件规模下,累计的系统调用开销会导致严重卡顿。 - 仅需判断名称开头匹配的场景下,使用
re.match()属于过度设计,正则引擎的初始化和匹配逻辑会带来不必要的性能损耗。
优化后的代码
import os def find_subfolders_of_interest(dir_of_interest, starting_string_of_interest): target_subfolders = [] # 使用os.scandir()一次性获取文件元数据,避免重复系统调用 with os.scandir(dir_of_interest) as entries: for entry in entries: # 利用DirEntry内置的is_dir()方法,无需额外I/O操作 if entry.is_dir() and entry.name.startswith(starting_string_of_interest): target_subfolders.append(entry.name) return target_subfolders def main(): all_subfolders_of_interest = find_subfolders_of_interest('test_folder', 'string_of_interest') if __name__ == '__main__': main()
额外优化建议
- 如果后续匹配规则变得复杂,再考虑使用预编译正则表达式;简单匹配场景下,字符串原生方法的性能始终更优。
- 若需要递归扫描多层子文件夹,Python3.5+版本的
os.walk()底层已采用scandir实现,性能同样出色;仅单层扫描时,scandir是最优选择。 - 针对超大规模目录,可尝试多进程并行扫描,但需注意I/O密集型任务的多进程开销,建议先做小范围测试验证收益。
内容的提问来源于stack exchange,提问作者BobInBaltimore
相关产品推荐
相关产品推荐

