Выбор ответа Middle NumPy: массивы и векторизация спрашивают часто обновлено
Почему np.vectorize не ускоряет
Вопрос
Почему np.vectorize(f)(a) обычно почти так же медленно, как цикл Python?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Потому что он внутри вызывает Python-функцию f для каждого элемента. np.vectorize удобная обёртка ради broadcasting, но не компилирует код: f остаётся Python-функцией и вызывается поэлементно.
Варианты ответа
- Потому что он запускает вычисления в нескольких потоках с накладными расходами
- Он ускоряет в 10-100 раз, а медленность это миф
- Потому что он сначала копирует массив в список Python
- Потому что он внутри вызывает Python-функцию
fдля каждого элементаправильный ответ
Разбор
np.vectorize удобная обёртка ради broadcasting, но не компилирует код: f остаётся Python-функцией и вызывается поэлементно. Настоящая векторизация это операции, реализованные в C: арифметика массивов, ufunc, np.where, агрегаты. Потоков np.vectorize не создаёт, массив в список не копирует, а заявленное «ускорение в разы» как раз заблуждение.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «NumPy: массивы и векторизация»
- Что значит axis=0
- Broadcasting: форма результата
- Обрезка выбросов по перцентилям
- Скользящее среднее через cumsum
- Попарные расстояния через broadcasting
- Стандартизация столбцов матрицы (z-score)
- Запись float в целочисленный массив
- Fancy indexing возвращает копию