Вы считаете метрику по большому массиву чисел и выбираете NumPy вместо Python list. Почему операции вроде arr * 1.1 на ndarray обычно быстрее, чем цикл for по list?

Andarray хранит данные однородно и выполняет операции в оптимизированном C-коде, минимизируя Python-циклы.
Blist хранит числа компактным блоком в одной области памяти, а ndarray использует pointer-ссылки и за счёт этого быстрее.
Cndarray по умолчанию выполняет вычисления на GPU без явных настроек и установки CUDA-библиотек.
Dndarray хранит в массиве разные типы (int, float, str) и переключается между ними быстрее, чем list.
Правильный ответ. Ускорение ndarray идёт за счёт однородного типа, непрерывной памяти и векторизованного C-кода, который минимизирует накладные расходы Python.

Разбор

Массив NumPy фиксирует один dtype, лежит в непрерывной области памяти и обрабатывается компилированными C-функциями (BLAS/SIMD). Поэтому arr * 1.1 запускает один внутренний цикл на C, а не цикл по объектам Python. У обычного list всё наоборот: он хранит ссылки на разнотипные объекты, и каждое умножение требует диспетчеризации Python. NumPy не запускает GPU автоматически — для этого нужны отдельные библиотеки (например, CuPy/JAX). Хранение «разных типов в одном массиве» — это про dtype=object, и оно как раз медленнее обычного NumPy.

Проверь себя · 1/3разбор после ответа
Какое значение вернёт arr.shape, если arr = np.array([[1, 2, 3], [4, 5, 6]])?
Тренировать Python в Telegram

Ещё вопросы по теме «NumPy: основы»