Распараллеливание для циклов в python - PullRequest
1 голос
/ 24 марта 2020

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

В принципе, у меня есть три кадра данных (размером 402 x 402 , 402 x 3142 и 1 x 402), и я объединяю элементы из них в расчет. Затем я записываю вычисления в другой фрейм данных - см. Код ниже с использованием фиктивных данных. Каждое вычисление занимает от 0,3 до 0,8 мс, но есть (402 x 3142) ^ 2 общих вычислений, что, очевидно, занимает много времени!

Поскольку ни один из вычислений не зависит ни от каких других, это созрело для распараллеливание, но мне действительно трудно понять, как это сделать - извините, код, вероятно, довольно уродлив, очень плохо знаком с python и параллельными вычислениями.

Еще одна вещь, на которую следует обратить внимание, это то, что не-векторные матрицы являются разреженными (0,4 и 0,3 соответственно), поэтому их можно изменить на координатный или сжатый формат строки / столбца, так что не все возможные комбинации вычислений должны быть выполнены. Это может сократить время вдвое.

import pandas as pd

A = pd.DataFrame(np.random.choice([0, 1], size=(402,402), p=[0.6,0.4]))
B = pd.DataFrame(np.random.choice([0, 1], size=(402,3142), p=[0.7,0.3]))
x = A.sum(axis = 1)

col_names = ["R", "I", "S", "J","value"]
results = pd.DataFrame(columns = col_names)

row = 0
for r in B.columns:
    for s in B.columns:
        for i in A.index:
            for j in A.columns:
                results.loc[row,"R"] = r
                results.loc[row,"I"] = i
                results.loc[row,"S"] = s
                results.loc[row,"J"] = j
                results.loc[row, "value"] = A.loc[i,j]*B.loc[j,s]*B.loc[i,r]/x[i]
                row = row + 1


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