【发布时间】:2017-02-08 04:37:13
【问题描述】:
这是一个运行良好的简单代码。即使函数 minimize 包装了 scipy.optimize.minimize 它也不会抱怨酸洗
import numpy as np
from scipy import optimize
from multiprocessing import Pool
def square(x):
return np.sum(x**2+ 2*x)
def minimize(args):
f,x = args
res = optimize.minimize(f, x, method = 'L-BFGS-B')
return res.x
x = np.random.rand(8,10)
args = [(square,x[i]) for i in range(8)]
p = Pool(8)
p.map(minimize,args)
但是,如果尝试以下操作会失败并出现酸洗错误
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
def run():
def square(x):
return np.sum(x**2+ 2*x)
def minimize(args):
f,x = args
res = optimize.minimize(f, x, method = 'L-BFGS-B')
return res.x
x = np.random.rand(8,10)
args = [(square,x[i]) for i in range(8)]
p = Pool(8)
p.map(minimize,args)
run()
我想制作一个模块以与许多初始猜测同时使用 scipy 最小化。但是,如示例所示,当我将其设为模块时,它会失败。
【问题讨论】:
-
pickle模块只能选择顶级函数。在您的第二个示例中,square不是顶级函数,因此无法腌制它。 -
谢谢@dano。但是如果我开箱即用,也会出现同样的错误。我的意思是在 run() 的定义之前。它不是让它成为顶级的吗?
-
您必须与
minimize相同,因为您也将其传递给map。抱歉,一开始就应该注意到这一点。 -
哦,太好了。谢谢@dano
标签: python optimization parallel-processing scipy multiprocessing