我有一个非常相似的问题 Python Multiprocessing Pool Map: AttributeError: Can't pickle local object
我想我知道问题出在哪里,只是不确定如何解决。 “ Pool.map”需要顶级功能作为输入。但我不知道该如何改写这个问题:
简化的代码版本:
import os as os
from multiprocessing import Pool
import numpy as np
def opti_fun_data(prediction):
def opti_fun(x):
def error_fun(i):
return error_fun_opti(x,prediction,i)
try:
pool = Pool(np.max([os.cpu_count()-1,1]))
error = np.mean(pool.map(error_fun, range(M)))
finally: # To make sure processes are closed in the end, even if errors happen
pool.close()
pool.join()
return error
return opti_fun
如果我跑步
opti_fun_data(prediction)(x0)
我得到
Can't pickle local object 'opti_fun_data.<locals>.opti_fun.<locals>.error_fun'
我是多处理库的新手,可以伸出援手。 对于那些对背景知识感兴趣的人: 我想最小化函数“ opti_fun”,以适应多种不同的场景/预测。计算我的错误量度/基准(“ error_fun_opti”)是计算密集型工作,因此我尝试并行化此步骤。
答案 0 :(得分:2)
将函数提升到最高级别,并使用functools.partial
提供范围值而不是嵌套范围。
def error_fun(x, prediction, i):
return error_fun_opti(x, prediction, i)
error = np.mean(pool.map(functools.partial(error_fun, x, prediction), range(M)))