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

如何实现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)

关键修改说明

  1. 串行变并行:外层多进程处理目录
    原来的for循环逐个遍历目录,现在用ProcessPoolExecutor同时启动12个进程,每个进程处理一个子目录,直接把12个目录的处理并行起来,充分利用你的24核CPU。

  2. 修正原代码的低级错误

    • 变量名拼写错误:sub_dir改成sub_directory,processer改成语义更清晰的process_single_file
    • np.save参数顺序错误:正确写法是np.save(保存路径, 数组),你原来写反了参数顺序
    • 用os.path.join拼接路径,避免手动拼接斜杠导致的跨平台问题
  3. 根据任务类型选并发方式

    • 外层目录处理:因为numpy运算属于CPU密集型任务,用ProcessPoolExecutor避开Python的GIL限制,让多核CPU真正跑满
    • 目录内部文件处理:如果你的文件读写操作多(IO密集),保留ThreadPoolExecutor足够;如果文件计算也很耗时(CPU密集),可以把目录内部的线程池换成ProcessPoolExecutor,但要注意总并发数不要超过24核,避免CPU过载
  4. 必加if __name__ == "__main__"
    多进程代码在Windows和部分Linux环境下必须加这个判断,避免进程启动时重复执行代码导致的错误

可选优化建议

  • 如果每个目录下的文件数量差异大,可以用submit+as_completed替代map,让任务完成一个就回收资源,避免某个大目录拖慢整体进度
  • 可以根据CPU负载动态调整max_workers:比如外层设为24,让每个目录的处理能用到更多核,但要注意不要让系统负载过高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 08:47:27