Python, многопроцессорная обработка с классами

#python #multiprocessing #overhead

#python #многопроцессорная обработка #накладные расходы

Вопрос:

Я реализовал небольшие статистические функции и распараллелил их с помощью многопроцессорной обработки. Общая структура кода выглядит следующим образом:

 def worker(args, no):
    f = Stat.fit(args)
    return f.result

class Stat:
    def fit(self):
        doing various things...

    def bootstrap(self):
        p = mp.Pool(mp.cpu_count())
        parameter = ... #set parameters for Stat
        worker = functools.partial(worker, parameter)

        for i, _ in enumerate(p.imap_unordered(worker, range(1000))):
            pass
  

Итак, метод начальной загрузки в классе Stat вызывает процессы, которые запускают функцию, которая создает экземпляр класса Stat и запускает методы fit() . Я думаю, что этот подход, возможно, довольно неэффективен. Лучше ли заменить класс функциями? Или использование подобных классов не влияет на производительность многопроцессорной обработки?

Ответ №1:

Это не неэффективно (это не повлияет на производительность), это просто неортодоксально. Вероятно, было бы немного чище, если бы вы убрали bootstrap из Stat , поскольку не похоже, что он выигрывает от того, что является методом этого класса.

 def worker(args, no):
    f = Stat.fit(args)
    return f.result

def bootstrap(self):
    p = mp.Pool(mp.cpu_count())
    parameter = ... #set parameters for Stat
    worker = functools.partial(worker, parameter)

    for i, _ in enumerate(p.imap_unordered(worker, range(1000))):
        pass

class Stat:
    def fit(self):
        doing various things...