为含独立步骤的数值计算For循环实现多核心并行加速
多核心并行优化实现方案
针对你的问题,外层循环(range(M))的每一轮计算完全独立,适合用多进程并行加速。下面是基于concurrent.futures.ProcessPoolExecutor的实现方案,能严格保证结果数组的顺序与原代码一致:
核心思路
- 将每一行(对应
m的一次迭代)的计算封装为独立函数,返回该行对应的B、C、D、E数据 - 利用进程池并行执行所有行的计算任务
- 按任务提交顺序收集结果,直接填充到目标数组中
优化后代码
import numpy as np from concurrent.futures import ProcessPoolExecutor # 假设你的fp和fP函数已定义在此处 def fp(args, ini): # 第一个子系统的不动点求解逻辑 pass def fP(args, ini2): # 第二个子系统的不动点求解逻辑 pass def process_single_row(m, A, T, v1, ini, ini2): """处理第m行的所有计算,返回该行的B、C、D、E数据""" inv_T = 1 / T[m] # 计算第一个子系统的解 r = np.array([fp([a, inv_T, v1], ini) for a in A]) # 计算第二个子系统的解 t = np.array([fP([A[a], v1, r[a,0], r[a,1]], ini2) for a in range(len(A))]) return (r[:,0], r[:,1], t[:,0], t[:,1]) if __name__ == "__main__": N = 300 M = 300 A = np.linspace(-3.1, -1, N) T = np.linspace(0.0005, 0.1, M) v1 = 1 # 自定义参数 ini = ... # 第一个子系统的初始值 ini2 = ... # 第二个子系统的初始值 # 初始化结果数组 B = np.empty(shape=(M,N)) C = np.empty(shape=(M,N)) D = np.empty(shape=(M,N)) E = np.empty(shape=(M,N)) # 启动进程池,max_workers默认使用CPU核心数 with ProcessPoolExecutor(max_workers=None) as executor: # 按m的顺序提交任务,map会严格按提交顺序返回结果 results = executor.map(process_single_row, range(M), [A]*M, [T]*M, [v1]*M, [ini]*M, [ini2]*M) # 遍历结果填充数组 for m, (b_row, c_row, d_row, e_row) in enumerate(results): B[m] = b_row C[m] = c_row D[m] = d_row E[m] = e_row
关键注意事项
- 确保
fp、fP函数以及ini、ini2初始值是可序列化的(picklable),否则进程池无法传递这些对象 max_workers可根据CPU核心数调整,通常设为核心数或核心数+1即可达到最优效率- 如果
fp函数内部的单个计算仍有优化空间,可进一步对内层循环并行化,但外层并行已能获得显著加速
内容的提问来源于stack exchange,提问作者Nikolai K.
相关产品推荐
相关产品推荐

