如何将以下Python嵌套for循环并行化执行?
Python 多进程并行实现方案
你原有逻辑中每个i、每个通道j的处理完全独立,无数据依赖,适合用concurrent.futures.ProcessPoolExecutor绕开GIL实现并行,以下是可直接复用的实现:
版本1:按i维度拆分任务(推荐,调度开销更低)
先拆分每个i对应的3个通道计算为单个任务,减少进程调度成本,同时保留原有的i%100打印逻辑:
import numpy as np from concurrent.futures import ProcessPoolExecutor # 单进程处理单个i的所有通道逻辑 def process_single_i(args): i, testX, N, kernel_matrix = args j_results = [] for j in range(3): img = testX[i,:,:,j] filtered_img = sr_cnn(img, N, kernel_matrix) j_results.append((j, filtered_img.astype(np.uint8))) if i % 100 == 0: print(f"已处理i={i}") return i, j_results # 并行主函数 def parallel_forlooptest(testX, N, kernel_matrix, max_workers=None): # 初始化输出数组,和原输出维度、类型完全一致 testX_new = np.zeros_like(testX, dtype=np.uint8) # 生成所有待处理的任务参数 task_list = [(i, testX, N, kernel_matrix) for i in range(10000)] # 启动进程池执行 with ProcessPoolExecutor(max_workers=max_workers) as executor: for i, j_results in executor.map(process_single_i, task_list): for j, filtered_img in j_results: testX_new[i,:,:,j] = filtered_img return testX_new
注意事项
- Windows系统下运行多进程代码时,必须把调用逻辑放在
if __name__ == '__main__':代码块中,否则会出现进程重复启动报错。 max_workers参数可根据CPU核心数调整,默认等于CPU核心数,若sr_cnn本身已经用到多线程计算,可适当调小该值避免资源竞争。- 若
testX数组过大,重复序列化传参有性能损耗时,可以改用multiprocessing.Array实现共享内存,降低数据拷贝开销。
内容的提问来源于stack exchange,提问作者Başak Esin Köktürk
相关产品推荐
相关产品推荐

