为了账号安全,请及时绑定邮箱和手机立即绑定

如何腌制 Python 类方法?

如何腌制 Python 类方法?

犯罪嫌疑人X 2021-11-23 19:49:38
在 Python 3.6 上,我定义了一个foo实例化对象的类p。在实例化时,该类执行计算成本高的插值并将插值函数“附加”到对象。完成此操作后,我可以调用其他类方法而无需再次插入。到现在为止还挺好。下面的代码显示了一个最小的工作示例:import numpy as npfrom scipy.integrate import quadfrom scipy.interpolate import interp1dclass foo(object):    def __init__(self):        self.func = self.interp()    def interp(self):        def integrand(x): return self.shape(x)        xpoints = np.arange(100)        ypoints = [quad(                        integrand, a=-np.inf, b=np.inf                        )[0]/x for x in xpoints]        I = interp1d(xpoints, ypoints)        return I    def shape(self, x):        F = x**2  # complicated maths here        return F然后我使用该p对象来执行繁重的任务。我将它并行化以进行优化。我multiprocessing像这样使用图书馆:import multiprocessing as mpwith mp.Pool(mp.cpu_count()) as pool:    results = pool.map(func, list(bar))  # func uses my p instance我得到一个错误MaybeEncodingError: Error sending result...,其回溯指向我的插值函数是不可选择的。我不知道如何腌制interp1d,我不想改变我当前代码的结构,因为这是经过深思熟虑的,我认为它是最有效的格式。我可以添加另一行(几行)来使我的插值函数成为顶级函数吗?我试过使用joblib,它一直在抱怨内存问题(即使使用了 1 个 cpu)。就我而言,multiprocessing真的可以完成这项工作。它实际上完成了工作,在终端中输出了结果,但未能将所有结果收集在一起。我要并行化的可迭代对象中的所有项目都是完全独立的。
查看完整描述

1 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

池使用多处理队列在进程之间传输数据。这些队列仅适用于可腌制的数据。Pickled 函数仅按名称存储并由 unpickler 重新导入。自然,这意味着它们必须是可导入的。

通常有一些方法可以解决这些酸洗问题,但可以省去麻烦并进行安装pathos。它的多处理池使用dill几乎可以处理任何东西。


查看完整回答
反对 回复 2021-11-23
  • 1 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信