Python中的简单并行网格搜索

时间:2017-02-08 18:39:11

标签: python multithreading python-2.7 parallel-processing

好的,完全披露,我不是在进行网格搜索,但是最小的例子我可以找到我要问的内容(含有一丝盐)减少到网格搜索(如果你想知道我为什么不提及numpy和朋友)。

我在Python中进行网格搜索,其中一个轴是离散的,另一个轴是连续的,但为了简单起见,我想说有以下内容:

x_axis = ['linear', 'quadratic', 'cubic']
y_axis = range(1, 100) # simplification

我的函数评估取决于轴和中间日志结构,所以为了没有全局数据,我将我的函数定义为闭包

def get_function(xval, *args): 
    """ creates the closure that encapsulates thread local data 
    """
    log = { } # initialization depends on args
    def fun(yval): 
    """ evaluation dedicated to single x_axis value 
    """
        if yval in log: 
            # in a proper grid search I wouldn't check twice
            # but this is just to show that log  is used and 
            # ammended inside fun()
        else: 
            log[yval] = 0

        return very_time_consuming_fun(xval, yval, log)

因此脚本使用此设置来运行网格搜索:

def func_eval(fun): 
    for yval in y_axis: 
        fun(yval)

# the loop I want to parallelize    
for xval in x_axis: 
    fun = get_function(xval, args) # args are computed based on xval
    func_eval(fun)                 # can I do result = func_eval(fun) ? 

我想问的是:

  • 我是否认为log适用于每个x_axis值的不同实例
  • 最后一种for循环并行化的最佳方法是什么?(如果log个实例需要同步,请详细说明)。同样,我只希望评估每个x_axis值到它的线程/核心/你的名字(欢迎最佳实践)
  • 有没有办法为每个func_eval 获取结果,即如果我有以下内容,它仍然可以并行化:

    out = func_eval(fun)
    

1 个答案:

答案 0 :(得分:0)

我讨厌沉默......

这就是我现在正在做的事情(所以至少如果不对的话,我会被贬低)

import multiprocessing

pool = multiprocessing.Pool()
funcs = [get_function(xval, args) for x in x_axis]
outputs = pool.map(func_eval, funcs)

这应该足够好,但我得到以下错误:

  

PicklingError:无法腌制:属性查找内置 .function失败