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

Почему np.vectorize не ускоряет

Вопрос

Почему np.vectorize(f)(a) обычно почти так же медленно, как цикл Python?

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: Потому что он внутри вызывает Python-функцию f для каждого элемента. np.vectorize удобная обёртка ради broadcasting, но не компилирует код: f остаётся Python-функцией и вызывается поэлементно.

Варианты ответа

  1. Потому что он запускает вычисления в нескольких потоках с накладными расходами
  2. Он ускоряет в 10-100 раз, а медленность это миф
  3. Потому что он сначала копирует массив в список Python
  4. Потому что он внутри вызывает Python-функцию f для каждого элементаправильный ответ

Разбор

np.vectorize удобная обёртка ради broadcasting, но не компилирует код: f остаётся Python-функцией и вызывается поэлементно. Настоящая векторизация это операции, реализованные в C: арифметика массивов, ufunc, np.where, агрегаты. Потоков np.vectorize не создаёт, массив в список не копирует, а заявленное «ускорение в разы» как раз заблуждение.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.