Объяснение массивов в Python!

Jan 23 2023
Если вы начинаете программировать или изучаете Python, эта статья для вас, ведь массивы — одна из наиболее часто используемых структур данных. Как Python представляет массивы? Как мы можем манипулировать массивами в Python для решения различных задач? Это то, что мы собираемся выяснить в этой статье.
Изображение экрана кодирования

Если вы начинаете программировать или изучаете Python, эта статья для вас, ведь массивы — одна из наиболее часто используемых структур данных. Как Python представляет массивы? Как мы можем манипулировать массивами в Python для решения различных задач? Это то, что мы собираемся выяснить в этой статье.

Как компьютеры хранят информацию?

Как вы знаете, основная форма информации в компьютере состоит из битов информации. 8 битов этой информации затем группируются, чтобы сформировать то, что мы называем байтом .

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

Стоит также отметить, что компьютеру требуется время доступа O(1) для доступа к любому адресу памяти, это означает, что доступ к байту № 5489637 аналогичен доступу к байту № 64.

Что такое массивы?

Общепринятой практикой в ​​языках программирования является использование переменных для ссылки на адрес в памяти, например, идентификатор X может ссылаться на байт № 32.

Если мы хотим хранить несколько адресов памяти, создание нескольких идентификаторов неэффективно и масштабируемо. Мы бы предпочли больше, если бы у нас было одно имя для группы идентификаторов и использование чисел для доступа к определенным идентификаторам. Такое представление представляет собой массив, другими словами, это представление группы переменных в непрерывной части памяти компьютера.

Строки в Python, например, хранятся таким образом, скажем, вы объявляете новую переменную с текстом «пример», который Python выделит:

2 байта (память, необходимая для хранения символа Unicode) * 7 (количество символов в примере слова) = 14 байт непрерывной памяти для хранения этой переменной.

Ссылочные массивы

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

Список имен

для этого Python должен соблюдать условие выделения непрерывного пространства памяти. Но как это сделать, когда имена имеют разную длину (разная длина означает разные требования к пространству)?

Одним из решений было бы найти длину самой большой строки и выделить достаточно места в памяти для всех, но это не будет эффективно использовать память, так как некоторое пространство будет потрачено впустую, и что, если появится новая строка, которая теперь является самой большой строкой?

Чтобы решить эту проблему, Python создает массив смежных ссылок на несколько объектов, поэтому теперь, хотя размер каждого отдельного объекта может варьироваться, память, используемая для хранения его адреса памяти, одинакова. Таким образом, Python гарантирует постоянное время доступа к различным элементам массива. Мы называем этот тип массива ссылочным массивом.

Чтобы проиллюстрировать это, взгляните на это изображение:

Иллюстрация ссылочного массива

Списки и кортежи в Python используют этот тип массива для хранения данных.

Примечание. Поскольку ссылочные массивы указывают на ссылки, будьте осторожны при изменении ссылочных значений, так как вы также можете по ошибке изменить значения в списках. Также при создании копий убедитесь, что вы знаете разницу между поверхностной и глубокой копией .

Компактные массивы

Ранее мы говорили о строках и о том, как мы храним их в массиве непрерывной памяти, на самом деле мы называем этот массив компактным массивом.

Преимуществом использования компактных массивов перед ссылочными является отсутствие дополнительных накладных расходов на хранение ссылок на память, мы храним непосредственно первичные данные. Еще одно преимущество, о котором стоит упомянуть, заключается в том, что в случае использования списка, который представляет собой ссылочный массив, Python не имеет контроля над тем, где хранятся ваши данные, даже если список поддерживает ссылки на то, где находятся данные. Из-за того, как работает аппаратное обеспечение, более эффективно располагать ваши данные близко друг к другу, они могут использоваться для одних и тех же вычислений.

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

создание компактного массива в python

Здесь вы заметили, что мы передали i в качестве первого аргумента array. Потому что для создания компактного массива нам нужно указать тип для правильного распределения памяти. Для других типов данных проверьте эту таблицу:

Типы данных в массиве

Если вы хотите узнать больше о модуле массива, нажмите здесь .

Недостатком модуля массива является то, что он не поддерживает определяемые пользователем типы данных. Компактные массивы с такой структурой данных можно определить с помощью модуля ctypes .

Динамические массивы

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

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

Эта абстракция использует экземпляр списка, который поддерживает базовый массив, емкость которого превышает длину фактического списка. Эта дополнительная емкость помогает нам добавлять в список все больше и больше данных.

Когда мы в конце концов исчерпаем дополнительную емкость, Dynamic Array запрашивает новый массив большего размера и копирует все элементы в новый массив, а система освобождает место из старого массива.

Список Python основан на этой абстракции, но кортежи и строки неизменяемы (не могут быть изменены), поэтому они не основаны на этом.

Стоит также отметить, что динамический массив не только увеличивается в размере, но и может уменьшаться, если мы удаляем элементы из списка.

Списки и кортежи

Итак, из анализа, который мы провели в предыдущем разделе, мы можем разделить методы списков и кортежей на два типа методов:

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

Неизменная сложность методов

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

Сложность методов мутации

Мы не обсуждали здесь, что делает каждый метод (он интуитивно понятен и прост), но вы можете узнать больше о списках и кортежах Python .

Выводы

  • Ссылочные массивы хранят ссылки в своей памяти массива, а затем получают доступ к фактическим значениям через ссылки.
  • Компактные массивы хранят фактические данные в непрерывной памяти.
  • Динамические массивы — это массивы, которые автоматически расширяются и сжимаются в зависимости от количества элементов в них.
  • Списки основаны на ссылочных и динамических массивах.
  • Кортежи основаны на ссылочных массивах.
  • Строка основана на компактных массивах.

Линкедин:https://www.linkedin.com/in/mohamed-aziz-belaweid/

Гитхаб:https://github.com/azayz

Читайте другие мои истории:

REALM: поиск расширенной языковой модели, предварительная подготовка к распознаванию эмоций на лице, практическое руководство!

Подпишитесь и получайте уведомления, когда я что-то публикую: