Рубрики
Без рубрики

Python – список против управления памятью кортежника

Эта статья будет коротким прочтением, мы сосредоточимся на том, как память управляется в Python для объекта … Tagged с помощью Python, программирования, новичков, информатики.

Эта статья будет коротким чтением, мы сосредоточимся на том, как память управляется в Python для таких объектов, как список и кортеж И что может быть ключевым выводом.

Давайте начнем!

Список

Список Python, как мы все знаем, является изменчивым динамическим массивом, который ведет себя как связанный список. Давайте посмотрим на какой -то код для создания и обновления списка:

# ./list_1.py

l = [1,2,3]     # A new list gets created
print('Initial List', l)

l.append(4)     # Updating list using in-built append method
print('Append 4, List updated to', l)

l.pop()         # Pop last item
print('Pop, List updated to', l)

l += [5, 6]     # Updating list by adding a new list to given list
print('Add new list, List updated to', l)

Следующее будет выход:

Initial List [1, 2, 3]
Append 4, List updated to [1, 2, 3, 4]
Pop, List updated to [1, 2, 3]
Add new list, List updated to [1, 2, 3, 5, 6]
>>>

Теперь давайте посмотрим, что произойдет в памяти, когда мы запустим приведенный выше сценарий, здесь мы будем использовать Sys Чтобы помочь нам в просмотре информации, связанной с системой:

# ./list_2.py

import sys
l = [1,2,3]     # A new list gets created
print('Initial List', l)
print('Initial List Address', id(l))
print('Initial List Memory', sys.getsizeof(l))

l.append(4)     # Updating list using in-built append method
print('Append 4, List updated to', l)
print('Append 4, List Address', id(l))
print('Append 4, List Memory', sys.getsizeof(l))

l.pop()         # Pop last item
print('Pop, List updated to', l)
print('Pop, List Address', id(l))
print('Pop, List Memory', sys.getsizeof(l))

l += [5, 6]     # Updating list by adding a new list to given list
print('Add new list, List updated to', l)
print('Add new list, List Address', id(l))
print('Add new list, List Memory', sys.getsizeof(l))

Сначала посмотрим на вывод:

Initial List [1, 2, 3]
Initial List Address 139688582615624
Initial List Memory 88
Append 4, List updated to [1, 2, 3, 4]
Append 4, List Address 139688582615624
Append 4, List Memory 120
Pop, List updated to [1, 2, 3]
Pop, List Address 139688582615624
Pop, List Memory 120
Add new list, List updated to [1, 2, 3, 5, 6]
Add new list, List Address 139688582615624
Add new list, List Memory 120
>>>

Следующие моменты мы можем выяснить после просмотра вывода:

  • Первоначально, когда список был создан, у него была память о 88 байты, с 3 элементами.
  • Позже, после добавления элемента 4 В список память изменяется на 120 Байты, что означает больше блоков памяти было связано с списком l .
  • Даже после выхода последнего элемента память созданных блоков остается прежней и все еще прикрепленной к списку l . И когда мы добавляем еще один список с еще 2 элементами в данное список l , мы видим, что занятая память все же 120 байты. Следовательно, мы можем сделать вывод, что он ведет себя больше как динамический массив, который обновляет размер списка, чтобы содержать больше элементов одновременно, чтобы избежать повторяющихся обратных вызовов (для создания и прикрепления нового адреса памяти) при каждой вставке нового элемента.
  • Мы также замечаем, что адрес списка остается прежним, даже если мы делаем добавление, POP или добавляем в него новый список (если мы не назначаем его новой переменной). Это выступает за природу изменчивости списков Python (это означает более или менее, что на том же адресе мы можем обновить значения или расширить их дальше).

Теперь давайте посмотрим на кортежи.

Кортеж

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

# ./tuple_1.py

import sys
t = (1,2,3)     # A new tuple gets created
print('Initial Tuple', t)
print('Initial Tuple Address', id(t))
print('Initial Tuple Memory', sys.getsizeof(t))

t += (5, 6,)     # Updating tuple by adding a new tuple to given tuple
print('Add new tuple, Tuple updated to', t)
print('Add new tuple, Tuple Address', id(t))
print('Add new tuple, Tuple Memory', sys.getsizeof(t))

Выход:

Initial Tuple (1, 2, 3)
Initial Tuple Address 140452527817280
Initial Tuple Memory 72
Add new tuple, Tuple updated to (1, 2, 3, 5, 6)
Add new tuple, Tuple Address 140452528572728
Add new tuple, Tuple Memory 88
>>>

Следующие моменты мы заметили после просмотра вывода:

  • Поскольку кортежи неизменны, после создания не могут быть обновлены, если только новый кортеж не будет добавлен к предыдущему, что привело к созданию нового кортежа.
  • Как только кортеж будет создан, его выделенная память не будет изменена.
  • Обновляя кортеж после добавления еще одного кортежа, обновляет адрес полученного кортежа, это выступало за свой свойство неизменности.
  • Мы видим, что это выделяет 72 байты для 3 значений и 88 Для 6 значений он не выделяет ненужное количество памяти, только то, что требуется, выделяется.

Давайте посмотрим на некоторые разные точки.

Разное

Что происходит, когда мы создаем пустой список и пустой кортеж?

# ./misc.py

import sys

t1 = ()
t2 = ()

l1 = []
l2 = []

print('List l1 address', id(l1))
print('List l2 address', id(l2))
print('List l1 memory', sys.getsizeof(l1))
print('List l2 memory', sys.getsizeof(l2))

print('List t1 address', id(t1))
print('List t2 address', id(t2))
print('List t1 memory', sys.getsizeof(t1))
print('List t2 memory', sys.getsizeof(t2))

Что мы получили?

List l1 address 139766851756616
List l2 address 139766851761800
List l1 memory 64
List l2 memory 64
List t1 address 139766871547976
List t2 address 139766871547976
List t1 memory 48
List t2 memory 48
>>>

Что мы нашли?

  • Создание 2 пустых списков имеет одинаковый объем памяти, выделенного, тогда как адрес обоих списков отличается. Это имеет смысл, потому что адрес списка должен будет действовать как изменчивое и не может быть одинаковым в определенное время, что означает, что 2 разных списка будут разными, если они не одинаковы (не в значении, а с точки зрения ссылки).
  • Создание 2 пустых кортежей имеет одинаковый объем памяти, и это будет указывать на один и тот же адрес. Это имеет смысл из -за его свойства неизменности. Рассмотрим целое число 1 Значение в питоне, которая неизменна и всегда указывает на один и тот же адрес, если не будет изменено на какое -то другое целое число. Точно так же начальный пустой кортеж всегда будет указывать на один и тот же адрес, если не будет изменено на какой -либо другой кортеж.

Ну, это все от меня.

Мы исследовали довольно много моментов о том, как распределяется память и как ее можно управлять на Python.

Чтобы узнать больше об управлении памятью, я призываю вас изучить их код, доступный на Python’s Репо Анкет

Чувствуете, что трудно пройти исходный код Python? Не волнуйтесь, мы всегда можем использовать доступные Sys Методы модуля и другие функции, такие как id Развивать понимание того, что может произойти за кулисами.

До следующего раза!

Намасте 🙏

Оригинал: “https://dev.to/siddharth2016/python-list-vs-tuple-memory-management-4056”