如何在scipy.integrate.quad_vec中使用workers参数?解决lambda序列化问题
解决scipy.integrate.quad_vec workers参数与lambda序列化冲突的问题
当你给quad_vec加上workers参数开启并行时,内部会用多进程拆分积分任务,这要求积分函数能被序列化(pickle)后传递给子进程。但lambda是匿名函数,没有在模块中注册固定名称,无法被pickle,所以会抛出序列化错误。
解决方法很直接,用普通命名函数替代lambda即可,具体步骤如下:
- 把原lambda中的积分逻辑抽成模块级别的命名函数,将需要用到的外部参数(比如
a、b、x0)作为函数参数明确传入:
import scipy as sp from scipy.special import spherical_jn def integrand(x, a, b, x0): return spherical_jn(a, b * (x0 - x))
- 调用
quad_vec时,用args参数把额外参数传递给这个命名函数,同时保留workers=-1开启并行:
result = sp.integrate.quad_vec( integrand, x_ini, x0, args=(a, b, x0), workers=-1 )
这样命名函数可以被正常序列化,多进程就能顺利执行积分任务。
如果觉得单独写函数太繁琐,也可以用functools.partial绑定固定参数,本质还是基于命名函数:
from functools import partial # 先绑定固定参数 bound_integrand = partial(integrand, a=a, b=b, x0=x0) # 调用时仅需传入x参数 result = sp.integrate.quad_vec( bound_integrand, x_ini, x0, workers=-1 )
内容的提问来源于stack exchange,提问作者kalle
相关产品推荐
相关产品推荐

