#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. Ах, хорошо, спасибо — я не знал об этом раньше!