Каков наилучший способ распараллелить этот процесс - PullRequest
0 голосов
/ 16 февраля 2019

Я пытался распараллелить процесс внутри метода класса.Когда я пытаюсь использовать Pool() из multiprocessing, я получаю ошибки травления.Когда я использую Pool() из multiprocessing.dummy, мое выполнение выполняется медленнее, чем сериализованное выполнение.

Я попытался несколько вариантов моего кода ниже, используя сообщения Stackoverflow в качестве руководства, но ни один из них не был успешным обходным путемдля описанной выше проблемы.

Например, один: если я переместу process_function выше определения класса (глобализирую его), это не сработает, потому что я не могу получить доступ к своим атрибутам объектов.

В любом случае, мой код похож на:

from multiprocessing.dummy import Pool as ThreadPool
from my_other_module import other_module_class   

class myClass:

    def __init__(self, some_list, number_iterations):

        self.my_interface = other_module_class
        self.relevant_list = []
        self.some_list = some_list
        self.number_iterations = number_iterations
        # self.other_attributes = stuff from import statements

    def load_relevant_data:

        self.relevant_list = self.interface.other_function

    def compute_foo(self, relevant_list_member_value):

        # math involving class attributes

        return foo_scalar

    def higher_function(self):

        self.relevant_list = self.load_relevant_data
        np.random.seed(0)
        pool = ThreadPool() # I've tried different args here, no help
        pool.map(self.process_function, self.relevant_list)

    def process_function(self, dict_from_relevant_list):

        foo_bar = self.compute_foo(dict_from_relevant_list['key'])
        a = 0
        for i in some_other_list:

            # do other stuff involving class attributes and foo_bar
            # a = some of that

        dict_from_relevant_list['other_key'] = a


if __name__ == '__main__':

    import time
    import pprint as pp

    some_list = blah
    number_of_iterations = 10**4
    my_obj = myClass(some_list, number_of_iterations
    my_obj.load_third_parties()
    start = time.time()
    my_obj.higher_function()
    execution_time = time.time() - start
    print()
    print("Execution time for %s simulation runs: %s" % (number_of_iterations, execution_time))
    print()
    pp.pprint(my_obj.relevant_list[0:5])

У меня есть несколько сотен словарей в соответствующем списке.Я просто хочу заполнить каждое поле 'other_key' этих словарей из вычислительно дорогостоящего моделирования в моем самом внутреннем цикле, которое дает скалярное значение, как a выше.Кажется, должен быть простой способ сделать это, так как в Matlab я мог бы просто исправить parfor, и это делается автоматически.Может быть, этот инстинкт не подходит для Python.

...