Сокращение памяти при простом умножении матриц - PullRequest
1 голос
/ 28 февраля 2020

Огромное матричное умножение может работать часами и занимать много памяти. В 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]]

Однако, если этот простой расчет применяется к огромному вектору и матрице, он потребляет много памяти. Как улучшить код, чтобы он занимал меньше памяти без чрезмерного увеличения времени выполнения?

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