Я знаю, что подобные вопросы по этой теме 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