Ответ
Утечки памяти в Python обычно связаны с объектами, на которые сохраняются ненужные ссылки, что мешает сборщику мусора их удалить. Для их обнаружения и анализа используются следующие инструменты:
-
tracemalloc(встроенный модуль) Отслеживает блоки памяти, выделенные Python, и предоставляет статистику по местам их выделения (файл, строка, трейсбек). Почему: Это стандартный и мощный инструмент для точного определения источника утечки.import tracemalloc tracemalloc.start() # ... код, в котором предполагается утечка ... data = [i for i in range(10000)] snapshot = tracemalloc.take_snapshot() top_stats = snapshot.statistics('lineno') print("[ Top 10 ]") for stat in top_stats[:10]: print(stat) -
objgraphБиблиотека для визуализации графа объектов в памяти. Особенно полезна для поиска циклических ссылок, которые не может собрать сборщик мусора (хотя современные GC с этим справляются лучше). Почему: Помогает понять, какие объекты ссылаются друг на друга и почему они не удаляются.import objgraph # Показывает 10 самых распространенных типов объектов objgraph.show_most_common_types() # Находит объект по типу и рисует граф ссылок на него x = [] y = [x] x.append(y) objgraph.show_backrefs([x], max_depth=5) -
memory-profilerПрофилировщик, который позволяет отслеживать потребление памяти построчно для конкретной функции. Почему: Идеален для оптимизации памяти в "горячих" участках кода и для наглядной демонстрации роста потребления памяти.# Использование через декоратор from memory_profiler import profile @profile def my_func(): a = [1] * (10 ** 6) b = [2] * (2 * 10 ** 7) del b return a if __name__ == '__main__': my_func()Запуск из консоли:
python -m memory_profiler my_script.py -
gc.get_objects()иgc.get_referrers()Встроенные функции модуляgcдля низкоуровневого анализа. Позволяют получить список всех отслеживаемых объектов и найти объекты, которые ссылаются на данный. Почему: Для глубокого ручного анализа и отладки сложных случаев.
Типичный рабочий процесс: Начать с tracemalloc или memory-profiler для локализации проблемы, а затем использовать objgraph для детального анализа ссылок на проблемные объекты.