这是一个运行良好的简单代码。即使函数最小化包装scipy.optimize.minimize它也不会抱怨酸洗
#include <stdio.h>
int main(){
char c[80] = "0";
char temp = '0';
int offSet = 0;
int i = 0;
int j =0;
int count =0;
printf("Enter first string: ");
gets(c);
while (*(c + offSet) != '\0') {
count++;
offSet++;
}
for (i = 0; i < count; i++) {
for (j = 0; j < count - 1; j++) {
if (c[j]>c[j + 1]) {
temp = c[j];
c[j] = c[j + 1];
c[j + 1] = temp;
}
}
}
puts(c);
return 0;
}
但是,如果尝试以下操作,则会因酸洗错误而失败
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
我想制作一个模块,使用scipy最小化与许多初始猜测并行。但是,如示例所示,当我将其作为模块时,它会失败。
答案 0 :(得分:1)
问题是Python无法腌制嵌套函数,在第二个示例中,您尝试将嵌套的minimize
和square
函数传递给子进程,这需要进行pickle。
如果您没有必要嵌套这两个功能,将它们移动到模块的顶层将解决问题。您还可以看到this question有关腌制嵌套函数的技巧。