好的,完全披露,我不是在进行网格搜索,但是最小的例子我可以找到我要问的内容(含有一丝盐)减少到网格搜索(如果你想知道我为什么不提及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)
答案 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失败