← Назад к вопросам

Какие знаешь типы памяти в Python?

1.7 Middle🔥 131 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы памяти в Python

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

1. Стек (Stack Memory)

Стек используется для хранения примитивных типов и ссылок на объекты. Это быстрая память с автоматическим управлением.

def function():
    x = 10           # int - на стеке
    y = "hello"      # строка - на куче, ссылка на стеке
    z = [1, 2, 3]    # список - на куче, ссылка на стеке
    # При выходе из функции, локальные переменные удаляются со стека

function()

Характеристики:

  • Быстрый доступ (LIFO — Last In, First Out)
  • Автоматическое очищение при выходе из области видимости
  • Ограниченный размер (переполнение → RecursionError)
  • Потокобезопасен по природе

2. Куча (Heap Memory)

Куча хранит сложные объекты: списки, словари, кастомные классы. Требует явного управления памятью или garbage collection.

import sys

my_list = [1, 2, 3, 4, 5]  # объект на куче
print(sys.getsizeof(my_list))  # примерно 56 байт

my_dict = {"key": "value", "num": 42}  # также на куче
print(id(my_list))  # адрес в памяти
print(id(my_dict))

Характеристики:

  • Медленнее стека (требует дополнительного поиска)
  • Неупорядоченное распределение
  • Требует garbage collection для освобождения
  • Потокоопасен только с блокировками

3. Пул целых чисел (Integer Pool)

Python предкэширует малые целые числа от -5 до 256 для оптимизации.

a = 256
b = 256
print(a is b)  # True - один и тот же объект

c = 257
d = 257
print(c is d)  # False - разные объекты в разных контекстах

# Создание через литерал
e = 257
f = 257
print(e is f)  # True - в одной строке кэшируется

Применение:

  • Экономия памяти на часто используемых значениях
  • Ускорение операций сравнения

4. Интернирование строк (String Interning)

Python кэширует некоторые строки для экономии памяти.

str1 = "hello"
str2 = "hello"
print(str1 is str2)  # True - один объект

str3 = "hello world"
str4 = "hello world"
print(str3 is str4)  # False - разные объекты

# Явное интернирование
import sys
str5 = sys.intern("hello world")
str6 = sys.intern("hello world")
print(str5 is str6)  # True

Правила интернирования:

  • Идентификаторы всегда интернируются
  • Строки без спецсимволов могут интернироваться
  • Строки со спецсимволами обычно не интернируются

5. Локальная память потока (Thread-Local Storage)

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

import threading

local_data = threading.local()

def worker(value):
    local_data.value = value  # каждый поток имеет свое значение
    print(f"Thread {threading.current_thread().name}: {local_data.value}")

t1 = threading.Thread(target=worker, args=(1,), name="T1")
t2 = threading.Thread(target=worker, args=(2,), name="T2")
t1.start()
t2.start()

6. Постоянная память (Static/Global)

Глобальные переменные и константы, существующие на протяжении всей программы.

CONSTANT_VALUE = 42  # на куче, но существует все время

def func():
    global CONSTANT_VALUE
    CONSTANT_VALUE = 100

func()
print(CONSTANT_VALUE)  # 100

Garbage Collection

Python использует счетчик ссылок (reference counting) для автоматического управления памятью.

import gc

obj = [1, 2, 3]
print(sys.getrefcount(obj))  # количество ссылок

del obj  # удаление ссылки, объект может быть удален
gc.collect()  # явный запуск сборки мусора

Лучшие практики оптимизации памяти

  • Используй локальные переменные вместо глобальных
  • Явно удаляй большие объекты: del large_object
  • Генераторы вместо списков для больших наборов данных
  • Слоты в классах для уменьшения памяти: __slots__ = ["attr1", "attr2"]
  • Профилируй память: memory_profiler, tracemalloc
  • Осторожнее с циклическими ссылками в больших структурах

Понимание типов памяти помогает писать более эффективный и надежный код.

Какие знаешь типы памяти в Python? | PrepBro