В 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...
, обратная трассировка которой указывает на то, что моя интерполирующая функция недоступна.
У меня нетя не знаю, как изменить структуру моего текущего кода, так как это было очень хорошо продумано, и я думаю, что оно в наиболее эффективном формате.Могу ли я добавить еще одну (несколько) строк, чтобы сделать мою интерполяционную функцию на высшем уровне?
Я пытался использовать joblib
, который продолжал жаловаться на проблемы с памятью (даже при использовании 1 процессора).
В моем случае multiprocessing
действительно может сделать эту работу.Он фактически завершает работу, выводит результат в терминал, но не может собрать все результаты вместе.Все элементы в итерируемой программе, для которой я распараллеливаюсь, полностью независимы.