БЫСТРЫЕ ВЫЧИСЛЕНИЯ

Списки Python против. Массивы NumPy: глубокое погружение в структуру памяти и преимущества производительности

Изучение различий в распределении ресурсов и повышение эффективности

В этой статье мы углубимся в различия в дизайне памяти между нативными списками Python и массивами NumPy, показав, почему во многих случаях NumPy может обеспечить более высокую производительность.

Мы сравним структуры данных, выделение памяти и методы доступа, демонстрируя мощь массивов NumPy.

Введение

Представьте, что вы собираетесь пойти в библиотеку за книгой. Теперь вы обнаруживаете, что в библиотеке есть две полки:

Первая полка заполнена различными изящными коробками, некоторые из которых содержат компакт-диски, некоторые с картинками, а некоторые с книгами. К коробке прикреплено только название предмета.

Это представляет нативные списки Python, где каждый элемент имеет свое пространство памяти и информацию о типе.

Однако у этого подхода есть проблема: много пустого места в коробках, что приводит к трате места на полках. Более того, когда вы хотите найти конкретную книгу, вы должны заглянуть внутрь каждой коробки, что занимает дополнительное время.

Теперь давайте посмотрим на вторую полку. На этот раз коробок нет; книги, компакт-диски и изображения компактно размещены вместе в соответствии с их категориями.

Это массивы NumPy, которые непрерывно хранят данные в памяти, улучшая использование пространства.

Поскольку все элементы сгруппированы по категориям, вы можете быстро найти книгу, не просматривая множество ящиков. Вот почему массивы NumPy быстрее, чем нативные списки Python во многих операциях.

Списки Python: гибкое, но менее эффективное решение

Все в Python является объектом

Начнем с интерпретатора Python: хотя CPython написан на C, переменные Python — это не базовые типы данных в C, а скорее структуры C, которые содержат значения и дополнительную информацию.

Возьмите целое число Python x = 10_000 в качестве примера, x не является базовым типом в стеке. Вместо этого это указатель на объект кучи памяти.