Почему в Python кортеж (tuple) занимает меньше памяти, чем список (list)?

Ответ

Кортеж (tuple) занимает меньше памяти, чем список (list) с теми же элементами, из-за ключевого различия: неизменяемости (immutability).

Это приводит к разным стратегиям выделения памяти:

  • Список (list) — изменяемый (mutable). Python выделяет для него память с запасом (over-allocates), чтобы операции добавления элементов, такие как append(), выполнялись эффективно (в среднем за O(1)) без необходимости каждый раз перераспределять память.

  • Кортеж (tuple) — неизменяемый (immutable). Поскольку его размер и содержимое не могут измениться после создания, Python выделяет ровно столько памяти, сколько необходимо для хранения его элементов. Никакого дополнительного пространства не требуется.

Пример сравнения

Разницу можно увидеть с помощью функции sys.getsizeof():

import sys

my_list = [1, 2, 3, 4, 5]
my_tuple = (1, 2, 3, 4, 5)

print(f"Размер списка: {sys.getsizeof(my_list)} байт")
# Вывод (примерный): Размер списка: 120 байт

print(f"Размер кортежа: {sys.getsizeof(my_tuple)} байт")
# Вывод (примерный): Размер кортежа: 80 байт

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

Ответ 18+ 🔞

Давай разберём эту хуйню про кортежи и списки, а то народ путается, как последние идиоты.

Вот представь: есть список — это как твой шкаф, куда ты постоянно хуяришь и выкидываешь вещи. Чтобы не бегать каждый раз в Икею за новым шкафом, когда футболка не лезет, ты сразу покупаешь шкаф с запасом места. Вот и Питон для списка (list) так же делает — выделяет памяти с запасом, овердохуища, чтобы метод append() не превращался в пиздец и работал быстро. Это называется over-allocate, если по-умному.

А теперь кортеж (tuple) — это уже не шкаф, а, блядь, герметичная капсула времени. Засунул туда свои пять хуёвин, запаял, и всё. Изменить нихуя нельзя. Размер фиксированный. Поэтому Питон, не долго думая, выделяет памяти ровно впритык, ни байта больше. Никаких запасов на рост, потому что роста не будет, ёпта. Зачем резервировать место под то, что никогда не случится? Вот в этом и есть вся магия.

Смотрим на цифры, а не на слова

Щас наглядно, чтобы сомнений не осталось:

import sys

my_list = [1, 2, 3, 4, 5]
my_tuple = (1, 2, 3, 4, 5)

print(f"Размер списка: {sys.getsizeof(my_list)} байт")
# Пример вывода: Размер списка: 120 байт

print(f"Размер кортежа: {sys.getsizeof(my_tuple)} байт")
# Пример вывода: Размер кортежа: 80 байт

Видишь разницу? Сорок байт на ветер! А если элементов сотни? Тут уже не хило так экономится.

Итог, блядь, простой: если твои данные — это священный грааль, который менять нельзя, хуярь кортеж. И безопаснее (случайно не перепишешь), и память ест меньше. А если коллекция должна дышать, расти и пукать новыми элементами — тогда только список, других вариантов нет. Всё гениальное — просто, как три рубля.