Ответ вслух Middle NumPy: массивы и векторизация спрашивают часто обновлено

Векторизация в NumPy на собесе

Вопрос

Что такое векторизация и почему цикл for по массиву NumPy считается плохим тоном? Когда без цикла не обойтись?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Векторизация значит описать вычисление как операцию над целыми массивами, чтобы цикл выполнялся внутри скомпилированного кода NumPy. Массив хранит числа одного типа подряд, поэтому C-цикл проходит их без проверок типов, часто с SIMD.

Что должно прозвучать в ответе

  • Векторизация: операция над всем массивом сразу, цикл внутри 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 ошибок.