Несогласованная производительность по времени для numpy `std`

#python #arrays #numpy #vectorization

#python #массивы #numpy #векторизация

Вопрос:

У меня есть некоторый код на Python, который включает в себя стандартное отклонение по осям numpy массива. Обычно мой массив имеет размеры приблизительно [100,500,2] . Я обнаружил, что в моем коде, если я попытаюсь использовать стандартное отклонение по оси 0 th, код выполняется очень медленно. т.Е. Если я делаю что-то вроде:

 # --------------------------------------------------------------

t1 = time.time()

# Perform standard deviation using numpy function
std_out = np.std(my_array, axis=0, ddof=1)

t2 = time.time()
print(t2-t1)

# --------------------------------------------------------------
  

Я получаю результат примерно 0.0034 в 0.0058 секундах. Однако, если я запускаю каждую из осей 2 поиска отдельно, вот так:

 # --------------------------------------------------------------

t1 = time.time()

# Initialize empty array
std_out2 = np.zeros(my_array.shape[-2:])

# Perform standard deviation using numpy function on each of the last axis seperately
std_out2[...,0] = np.std(my_array[...,0], axis=0, ddof=1)
std_out2[...,1] = np.std(my_array[...,1], axis=0, ddof=1)

t2 = time.time()
print(t2-t1)

# --------------------------------------------------------------
  

Я получаю результат около 0.00076 секунд. Я проверил, и std_out и std_out2 равны и имеют один и тот же тип данных ( np.float64 ) . Я не могу понять, почему это было бы.

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

Я не могу понять, почему это происходит, и я не знаю, с чего начать с точки зрения снижения этой низкой производительности по времени. Кто-нибудь знает, почему это может происходить? Может ли это быть вызвано какой-либо проблемой с памятью?

Комментарии:

1. Имейте в виду, что time.time() это не предназначено для измерения производительности. Вы должны использовать модуль timeit или %timeit магию в ipython.

2. Ах, хорошо, спасибо — я не знал об этом раньше!