如何实现Python代码同时运行于12个子目录以提升效率?
优化方案:并行处理多目录
你的代码目前是逐个串行处理子目录,每个目录内部开线程池处理文件,这就导致12个目录没法同时利用CPU资源。结合你24核的硬件配置,我们可以用多进程并行处理所有子目录,同时针对numpy计算的CPU密集特性,选择更合适的ProcessPoolExecutor来避开GIL限制。
修正后的完整代码
import os import glob import numpy as np from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor wd = "/data0/" sub_directories = [ wd + "jan/", wd + "feb/", wd + "mar/", wd + "apr/", wd + "may/", wd + "jun/", wd + "jul/", wd + "aug/", wd + "sep/", wd + "oct/", wd + "nov/", wd + "dec/" ] def process_single_file(file): # 单个文件的处理逻辑,修正原函数的拼写和语法问题 data = np.fromfile(file) # 替换成你的实际计算逻辑,这里用示例运算占位 result = np.array(data * 2) # 修正np.save参数顺序:先指定保存路径,再传入数组 np.save(file + ".npy", result) def process_directory(sub_directory): # 单个目录的处理逻辑:获取文件列表 + 批量处理文件 files = glob.glob(os.path.join(sub_directory, "*.txt")) # 用os.path.join避免路径拼接错误 # 目录内部如果是IO密集(文件读写多),用ThreadPoolExecutor足够;若为CPU密集,可换成ProcessPoolExecutor with ThreadPoolExecutor(max_workers=5) as tpe: tpe.map(process_single_file, files) if __name__ == "__main__": # 外层用ProcessPoolExecutor并行处理12个目录,max_workers设为12刚好匹配目录数,也可根据负载调整为24 with ProcessPoolExecutor(max_workers=12) as ppe: ppe.map(process_directory, sub_directories)
关键修改说明
串行变并行:外层多进程处理目录
原来的for循环逐个遍历目录,现在用ProcessPoolExecutor同时启动12个进程,每个进程处理一个子目录,直接把12个目录的处理并行起来,充分利用你的24核CPU。修正原代码的低级错误
- 变量名拼写错误:
sub_dir改成sub_directory,processer改成语义更清晰的process_single_file np.save参数顺序错误:正确写法是np.save(保存路径, 数组),你原来写反了参数顺序- 用
os.path.join拼接路径,避免手动拼接斜杠导致的跨平台问题
- 变量名拼写错误:
根据任务类型选并发方式
- 外层目录处理:因为numpy运算属于CPU密集型任务,用
ProcessPoolExecutor避开Python的GIL限制,让多核CPU真正跑满 - 目录内部文件处理:如果你的文件读写操作多(IO密集),保留
ThreadPoolExecutor足够;如果文件计算也很耗时(CPU密集),可以把目录内部的线程池换成ProcessPoolExecutor,但要注意总并发数不要超过24核,避免CPU过载
- 外层目录处理:因为numpy运算属于CPU密集型任务,用
必加
if __name__ == "__main__"
多进程代码在Windows和部分Linux环境下必须加这个判断,避免进程启动时重复执行代码导致的错误
可选优化建议
- 如果每个目录下的文件数量差异大,可以用
submit+as_completed替代map,让任务完成一个就回收资源,避免某个大目录拖慢整体进度 - 可以根据CPU负载动态调整
max_workers:比如外层设为24,让每个目录的处理能用到更多核,但要注意不要让系统负载过高
内容的提问来源于stack exchange,提问作者Yuqi
相关产品推荐
相关产品推荐

