该函数scipy.optimize.fmin_bfgs
允许用户输入目标函数和梯度。由于我的桌面上有一台 8 核机器,我想我可以通过运行并行化求解器
from scipy import optimize
import itertools
import numpy as np
def single_grad_point((idx,px)):
p = px.copy()
epsilon = 10**(-6.0)
p[idx] += epsilon
d1 = err_func(p)
p[idx] -= 2*epsilon
d2 = err_func(p)
return (d1-d2)/(2*epsilon)
def err_func_gradient(p):
P = multiprocessing.Pool()
input_args = zip(*(xrange(len(p)), itertools.cycle((p,))))
sol = P.imap(single_grad_point, input_args)
return np.array(list(sol))
optimize.fmin_bfgs(err_func, p0, fprime=err_func_gradient)
简而言之,我使用多重处理来计算梯度的每个方向。如果目标函数err_func
很昂贵,这似乎会获得显着的加速。然而,我的问题是关于所有multiprocessing.Pools
. 既然有可能err_func_gradient
被调用数万次,这会导致速度变慢或在某处泄漏吗?