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

为含独立步骤的数值计算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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:16:03