Настройка
У меня есть следующие две реализации матричного вычисления:
- Первая реализация использует
matrix of shape (n, m)
и вычисление повторяется в цикле for для repetition
-times:
import numpy as np
from numba import jit
@jit
def foo():
for i in range(1, n):
for j in range(1, m):
_deleteA = (
matrix[i, j] +
#some constants added here
)
_deleteB = (
matrix[i, j-1] +
#some constants added here
)
matrix[i, j] = min(_deleteA, _deleteB)
return matrix
repetition = 3
for x in range(repetition):
foo()
2. Вторая реализация исключает дополнительный цикл for и, следовательно, включает в себя repetition = 3
в матрицу, которая тогда имеет значение shape (repetition, n, m)
:
@jit
def foo():
for i in range(1, n):
for j in range(1, m):
_deleteA = (
matrix[:, i, j] +
#some constants added here
)
_deleteB = (
matrix[:, i, j-1] +
#some constants added here
)
matrix[:, i, j] = np.amin(np.stack((_deleteA, _deleteB), axis=1), axis=1)
return matrix
Вопросы
Относительно обеих реализаций, яобнаружил две вещи относительно их производительности с %timeit
в iPython.
- Первая реализация сильно выигрывает от
@jit
, а вторая - вовсе (28 мс против 25 с в моем тестовом примере). Кто-нибудь может представить, почему @jit
больше не работает с массивом фигур (repetition, n, m)
?
Редактировать
Я переместил предыдущий второй вопрос в дополнительный пост , поскольку задание нескольких вопросов считается плохим стилем SO.
Вопросбыло:
При игнорировании
@jit
первая реализация все еще намного быстрее (тот же тест: 17 с против 26 с).
Почему numpy медленнее при работе с тремя, а не с двумя измерениями?