Как оптимизировать следующее для кода цикла? - PullRequest
2 голосов
/ 22 октября 2019

У меня очень большой набор данных, и я использую следующий код. Это занимает слишком много времени для вычислений, и я хочу сократить количество итераций.

Как улучшить производительность кода?

import numpy as np

Z=np.asarray([[1,2],
              [3,4],
              [5,6],
              [7,8]])

R=np.asarray([[1,2,3],
              [4,5,6]])

AL=np.asarray([[1,2,3],
               [4,5,6]])

X=np.asarray([[1,2,3],
              [4,5,6],
              [7,8,9],
              [10,11,12]])

N = 4
M = 2
D = 3

result = np.ones([N, D])
for i in range(N):
  for l in range(D):
    temp=[]
    for j in range(M):
      temp.append(Z[i][j]*(R[j][l]+AL[j][l]*X[i][l]))
    result[i][l] = np.sum(temp)   

print(result)

Вывод:

array([[ 18.,  36.,  60.],
       [ 95., 156., 231.],
       [232., 360., 510.],
       [429., 648., 897.]])

1 Ответ

3 голосов
/ 22 октября 2019

При использовании numpy предпочитайте использовать операции с матрицами и массивами вместо for итераций. Производительность значительно выше.

Ваше решение можно записать в виде:

result = Z.dot(R) + Z.dot(AL) * X

Вывод:

array([[ 18.,  36.,  60.],
       [ 95., 156., 231.],
       [232., 360., 510.],
       [429., 648., 897.]])
...