Я использую многопроцессорную функцию 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)
Как можно избежать запуска процессов, которые соответствуют нижней половине (или верхней половине) матрицы?