在函数内部进行多处理scipy优化的奇怪行为

时间:2016-09-29 18:15:03

标签: python optimization parallel-processing scipy multiprocessing

这是一个运行良好的简单代码。即使函数最小化包装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最小化与许多初始猜测并行。但是,如示例所示,当我将其作为模块时,它会失败。

1 个答案:

答案 0 :(得分:1)

问题是Python无法腌制嵌套函数,在第二个示例中,您尝试将嵌套的minimizesquare函数传递给子进程,这需要进行pickle。

如果您没有必要嵌套这两个功能,将它们移动到模块的顶层将解决问题。您还可以看到this question有关腌制嵌套函数的技巧。