Почему в 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 байт

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