我怎样才能挑选Python类方法?

问题描述 投票:1回答:1

在Python 3.6上,我定义了一个类foo,它实例化了一个对象p。在实例化时,该类执行计算上昂贵的插值并将插值函数“附加”到对象。

完成后,我可以调用其他类方法而无需再次插值。到现在为止还挺好。

下面的代码中显示了一个最小的工作示例:

import numpy as np
from scipy.integrate import quad
from scipy.interpolate import interp1d

class 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 mp

with 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可以真正做到这一点。它实际上完成了工作,在终端输出结果,但未能一起收集所有结果。我正在并行化的iterable中的所有项都是完全独立的。

python parallel-processing scipy multiprocessing joblib
1个回答
2
投票

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

通常有办法解决这些酸洗问题,但要避免头痛并安装pathos。它的多处理池使用dill,几乎可以腌制任何东西。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.