【问题标题】:Simplistic parallel grid search in PythonPython中的简单并行网格搜索
【发布时间】:2017-06-26 13:00:13
【问题描述】:

好的,完全公开,我不是在进行网格搜索,但 最小示例 我可以找到我要问的内容(有一点盐)简化为网格搜索(如果你想知道为什么我不提到 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)
    

【问题讨论】:

    标签: python multithreading python-2.7 parallel-processing


    【解决方案1】:

    我讨厌沉默……

    这就是我现在正在做的事情(所以如果它不正确,至少我会被否决)

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

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

    PicklingError: Can't pickle : attribute lookup builtin.function failed

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 2012-05-04
      • 1970-01-01
      • 2016-04-10
      • 2013-12-30
      • 2017-09-09
      • 2012-11-02
      • 2016-09-20
      • 1970-01-01
      相关资源
      最近更新 更多