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

如何并行化SciPy shgo优化器?解决多参数优化速度慢问题

实现SciPy shgo优化器并行化的方法

1. 利用shgo内置的workers参数(推荐)

从SciPy 1.7.0版本开始,shgo原生支持并行计算,通过workers参数即可开启全局搜索阶段的目标函数并行评估:

修改后的代码示例

opt = shgo(objective_function,
           bounds=bnds,
           iters=2,
           minimizer_kwargs={'method': 'SLSQP', 'ftol': 1e-3},
           workers=-1  # 使用全部可用CPU核心;也可指定具体数量,如4
           )

关键注意点

  • workers仅作用于全局搜索阶段的目标函数计算,局部优化阶段(此处为SLSQP)仍为串行,但全局阶段的并行已能大幅降低总耗时,尤其适合目标函数单次计算耗时的场景。
  • 确保objective_function可被序列化(避免嵌套函数定义、使用无法被pickle序列化的对象),否则并行时会抛出异常。若需使用嵌套函数,可通过functools.partial包装后传入。

2. 手动并行化目标函数(适配旧版SciPy)

若你的SciPy版本低于1.7.0,无workers参数,可通过joblib或multiprocessing手动实现目标函数的批量并行计算:

基于joblib的实现示例

from joblib import Parallel, delayed

# 包装目标函数,支持批量输入并行计算
def parallel_objective(xs):
    return Parallel(n_jobs=-1)(delayed(objective_function)(x) for x in xs)

opt = shgo(parallel_objective,
           bounds=bnds,
           iters=2,
           minimizer_kwargs={'method': 'SLSQP', 'ftol': 1e-3},
           vectorized=True  # 告知shgo目标函数支持批量输入
           )

关键注意点

  • 必须设置vectorized=True,让shgo识别目标函数可接收多组输入并返回对应结果列表。
  • 此方式需自行处理并行细节,复杂度高于内置方案,优先建议升级SciPy版本使用原生并行。

额外优化建议

  • 优先优化目标函数本身:检查函数内部是否存在重复计算、冗余逻辑,单函数效率的提升可能比并行带来的收益更显著。
  • 调整迭代参数:iters=2意味着全局搜索仅执行2次迭代,若参数空间需要更充分搜索,可适当增加迭代次数,并行化可抵消迭代增加的时间成本。
  • 局部优化器选型:SLSQP时间复杂度为O(n³),当前8个参数的场景影响不大,若后续参数数量增加,可考虑换用L-BFGS-B等更低复杂度的局部优化器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:35:07