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

Какие знаешь способы освобождения памяти в Python?

2.3 Middle🔥 171 комментариев
#Python Core

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

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

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

Автоматическое управление памятью

Python использует подсчет ссылок (reference counting) как основной механизм управления памятью. Когда количество ссылок на объект становится нулевым, объект удаляется и память освобождается автоматически. Это работает для большинства случаев и разработчику не нужно беспокоиться.

import sys

# Проверка количества ссылок
x = [1, 2, 3]
print(sys.getrefcount(x))  # 2 (сама переменная + аргумент функции)

# После удаления ссылки
del x  # объект удаляется

Явное удаление ссылок

Можно явно удалить переменную оператором del, что освобождает занятое ею место в памяти:

large_list = list(range(1000000))
print(sys.getsizeof(large_list))  # размер объекта
del large_list  # освобождение памяти

Циклические ссылки и сборка мусора

В Python есть второй уровень управления памятью — сборщик мусора (garbage collector), который обрабатывает циклические ссылки:

import gc

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

# Циклическая ссылка
a = Node(1)
b = Node(2)
a.next = b
b.next = a  # цикл!

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

Контекстные менеджеры для управления ресурсами

Для файлов, соединений с БД и сетевых запросов используй контекстные менеджеры with, которые гарантируют освобождение ресурсов:

# Файл закроется автоматически
with open("data.txt") as f:
    data = f.read()

# Эквивалентно:
f = open("data.txt")
try:
    data = f.read()
finally:
    f.close()

Слабые ссылки

Модуль weakref позволяет создавать ссылки, которые не препятствуют удалению объекта:

import weakref

class Cache:
    def __init__(self):
        self.data = {}  # хранит обычные ссылки
        self.weak_data = weakref.WeakValueDictionary()  # слабые ссылки

cache = Cache()
obj = [1, 2, 3]
cache.data["key1"] = obj  # объект останется в памяти
cache.weak_data["key2"] = obj  # объект удалится, если удалить obj

del obj
print("key2" in cache.weak_data)  # False — объект удален

Контроль сборщика мусора

Можно управлять поведением сборщика мусора для оптимизации под конкретные задачи:

import gc

# Отключить сборку мусора (для критичных по времени операций)
gc.disable()
# ... выполни быструю операцию ...
gc.collect()  # собери вручную
gc.enable()

# Посмотреть статистику
stats = gc.get_stats()
print(f"Поколения: {len(stats)}")

Практические рекомендации

  • Используй контекстные менеджеры для файлов и ресурсов
  • Избегай циклических ссылок или используй слабые ссылки
  • Не полагайся только на del — это плохой стиль
  • Для оптимизации памяти профилируй код с memory_profiler или tracemalloc