Огромное матричное умножение может работать часами и занимать много памяти. В Stackoverflow уже есть несколько вопросов, касающихся того, как уменьшить потребление памяти, например, [здесь] Python NUMPY ОГРОМНОЕ умножение матриц .
Одно из предложений состоит в том, чтобы выполнять умножение строки за строкой, чтобы одновременно загружались только две строки, что я считаю довольно простым, хотя и очень медленным. Другое предложение состоит в том, чтобы использовать разреженные представления, и именно здесь мои математические знания достигают своих пределов.
Хотя это большой топик c, я еще не нашел несколько простых примеров реализаций. Поэтому я задаю этот вопрос на основе REPREX. Это, вероятно, поможет некоторым людям в будущем. В этом примере у меня есть вектор и матрица, которые я хотел бы умножить. После этого я строю сумму каждой строки в полученной матрице. Мой пример выглядит так:
myV = [6.29586100e-05, 5.04149100e-04, 1.44845100e-05]
myM = [[1,0,0],[0,0,1],[0,0,1],[0,0,0],[0,1,1]]
result = myfun(myV, myM)
При этом myfun
определяется следующим образом:
def myfun(V, M):
results=[]
#convert lists into matrices
npV = np.matrix(V)
npM = np.matrix(M)
#mutliply matrices
results = np.multiply(npV, npM)
#print for understanding
print('npV');print(npV)
print('npM'); print(npM)
print('result');print(result)
#sum probabilities of morph given every word
sum_results = np.sum(results,axis=1).tolist()
print('sum_results'); print(sum_results)
#convert numpy array back to list
list_results = [value for sublist in sum_results for value in sublist]
return(list_results)
Для иллюстрации я напечатал, что происходит:
npV
[[ 6.29586100e-05 5.04149100e-04 1.44845100e-05]]
npM
[[1 0 0]
[0 0 1]
[0 0 1]
[0 0 0]
[0 1 1]]
results
[[ 6.29586100e-05 0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 0.00000000e+00 1.44845100e-05]
[ 0.00000000e+00 0.00000000e+00 1.44845100e-05]
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 5.04149100e-04 1.44845100e-05]]
sum_results
[[6.295861e-05], [1.448451e-05], [1.448451e-05], [0.0], [0.00051863361]]
Однако, если этот простой расчет применяется к огромному вектору и матрице, он потребляет много памяти. Как улучшить код, чтобы он занимал меньше памяти без чрезмерного увеличения времени выполнения?