Векторизация в NumPy на собесе
Вопрос
Что такое векторизация и почему цикл for по массиву NumPy считается плохим тоном? Когда без цикла не обойтись?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Векторизация: операция над всем массивом сразу, цикл внутри C-кода
Однородный dtype и непрерывная память, нет объектов Python на элемент
Цикл Python платит за интерпретатор и упаковку чисел на каждой итерации
Инструменты: арифметика, ufunc, broadcasting, np.where, агрегаты по осям, cumsum
Когда шаг зависит от предыдущего результата: Numba, Cython или переформулировать через cumsum/accumulate
Цена: промежуточные массивы съедают память
Что могут спросить следом
- Почему
np.vectorizeне ускоряет? - Как посчитать попарные расстояния без цикла?
- Что делать, если промежуточный массив не влезает в память?
Разбор
Векторизация значит описать вычисление как операцию над целыми массивами, чтобы цикл выполнялся внутри скомпилированного кода NumPy. Массив хранит числа одного типа подряд, поэтому C-цикл проходит их без проверок типов, часто с SIMD. Цикл for по массиву на каждом шаге достаёт элемент, упаковывает его в объект Python и гоняет через интерпретатор, это в десятки раз медленнее. Инструменты: арифметика массивов, ufunc вроде np.exp, broadcasting, np.where вместо if, агрегаты с axis, cumsum и diff. Цикл неизбежен, когда каждый шаг зависит от предыдущего нетривиально, например рекуррентная формула с условием: тогда Numba или Cython, либо ищу формулировку через накопительные функции. Минус векторизации: промежуточные массивы занимают память, на больших данных считаю кусками.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «NumPy: массивы и векторизация»
- Что значит axis=0
- Broadcasting: форма результата
- Обрезка выбросов по перцентилям
- Скользящее среднее через cumsum
- Попарные расстояния через broadcasting
- Стандартизация столбцов матрицы (z-score)
- Запись float в целочисленный массив
- Fancy indexing возвращает копию