多处理池映射:AttributeError:无法pickle本地对象

2024-03-28 13:55:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个非常类似的问题 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\u fun\u opti”)是一项安静的计算密集型工作,因此我尝试将这一步骤并行化


Tags: importdatareturnoslocaldefnperror
1条回答
网友
1楼 · 发布于 2024-03-28 13:55:23

将函数提升到顶层,并使用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)))

相关问题 更多 >