Как я могу мариновать метод класса Python? - PullRequest
0 голосов
/ 02 марта 2019

В 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 действительно может сделать эту работу.Он фактически завершает работу, выводит результат в терминал, но не может собрать все результаты вместе.Все элементы в итерируемой программе, для которой я распараллеливаюсь, полностью независимы.

1 Ответ

0 голосов
/ 03 марта 2019

Пулы используют многопроцессорные очереди для передачи данных между процессами.Эти очереди работают только для извлекаемых данных.Маринованные функции просто сохраняются по имени и повторно импортируются устройством выбора.Естественно, это означает, что они должны быть импортируемыми.

Обычно есть способы обойти эти проблемы травления, но избавьте себя от головной боли и вместо этого установите pathos.В его многопроцессорных пулах используется dill, который может обрабатывать практически все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...