При перемножении столбцов в NumPy по индексу столбца наблюдается большое время перемножения (профайлинг времени приложен). Как можно исправить?

8                                           @profile
 9                                           def zero_one_two(grid, N):
10     23810       236265      9.9      1.1      if 1 in grid[:, 0]:
11       731         9416     12.9      0.0          grid[:, 0][np.where(grid[:, 0] > 0)[0]] = 2
12     23810       201348      8.5      0.9      left_con = grid[:, 0]*grid[:, 1]
13     23810       195165      8.2      0.9      left_true_indices = np.where(left_con > 0)[0]
14     23810        49803      2.1      0.2      if left_true_indices.size:
15     16896        68303      4.0      0.3          grid[:, 0][left_true_indices] = 2
16     16896        56940      3.4      0.3          grid[:, 1][left_true_indices] = 2
17    861832      1671442      1.9      7.5      for j in np.arange(1, N-1):
18    838022      6193150      7.4     27.8          col_mult = grid[:, j] * grid[:, j+1]
19    838022      6079750      7.3     27.3          col_mult_true_indices = np.where(col_mult > 1)[0]
20    838022      1591003      1.9      7.1          if col_mult_true_indices.size:
21     94221       337757      3.6      1.5              grid[:, j][col_mult_true_indices] = 2
22     94221       377351      4.0      1.7              grid[:, j+1][col_mult_true_indices] = 2
23     94221       653747      6.9      2.9              col_con = grid[:-1, j]*grid[1:, j]
24     94221       694403      7.4      3.1              col_con_indices = np.where(col_con == 2)[0]
25     94221       490465      5.2      2.2              col_con_indices2 = col_con_indices + 1
26     94221       352366      3.7      1.6              grid[:, j][col_con_indices] = 2
27     94221       302229      3.2      1.4              grid[:, j][col_con_indices2] = 2
28     94221       757152      8.0      3.4              col_con2 = grid[:-1, j+1]*grid[1:, j+1]
29     94221       691756      7.3      3.1              col_con2_indices = np.where(col_con2 == 2)[0]
30     94221       482827      5.1      2.2              col_con2_indices2 = col_con2_indices + 1
31     94221       414628      4.4      1.9              grid[:, j+1][col_con2_indices] = 2
32     94221       371939      3.9      1.7              grid[:, j+1][col_con2_indices2] = 2
  • Вопрос задан
  • 406 просмотров
Пригласить эксперта
Ответы на вопрос 1
tsarevfs
@tsarevfs
C++ developer
Скорее всего матрицы хранятся в виде массива строк. Поэтому при работе со столбцами приходится активно прыгать по памяти и эффективность кэша процессора падает. Можно попробовать транспонировать матрицу перед активной работой со столбцами, и перемножать строчки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы