如何并行化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
相关产品推荐
相关产品推荐

