Mutliprocessing.starmap: фильтрация - PullRequest
       28

Mutliprocessing.starmap: фильтрация

1 голос
/ 25 февраля 2020

Я использую многопроцессорную функцию Pool().starmap(), чтобы выполнить тип вычисления по нескольким продуктам, который является симметричным, и я делаю одно и то же вычисление дважды. Как я могу это исправить, чтобы запустить только половину процессов? Что занимает у меня больше времени, так это запуск процессов и выбор объектов.

1 ° У меня есть список объектов X, всех одного класса, с общим методом prod_scalar таким, что X[i].prod_scalar(X[j]) == X[j].prod_scalar(X[i])

Поэтому я использую код, который выглядит следующим образом:

import itertools as it
import multiprocessing as mp
import os
import numpy as np


class ComplicatedThing:
    def __init__(self,number):
        self.n = number

    def interaction(self,other_ComplicatedThing):
        # Do very complicated things to return a scalar result, which is symmetrical : x.interaction(y) == y.interaction(x)
        return self.n*other_ComplicatedThing.n

    def interact_with_myself(self):
        # x.interact(x) is equal to x.interact_with_myself, but x.interact_with_myself() is a lot faster.
        return self.n**2

def interact_with(obj1,obj2):
    return obj1.interaction(obj2)


class MyClass:

    def __init__(self,max):
        self.objects = [ComplicatedThing(i) for i in range(max)]
        pool = mp.Pool(os.cpu_count() -1)
        self.result_matrix = np.array(pool.starmap(interact_with,it.product(self.objects,self.objects))).reshape(max,max)



if __name__ == '__main__':

    obj = MyClass(10)
    print(obj.result_matrix)

Как можно избежать запуска процессов, которые соответствуют нижней половине (или верхней половине) матрицы?

...