Какой профилировщик памяти Python рекомендуется? [закрытый]
Я хочу знать использование памяти моего приложения Python и особенно хочу знать, какие блоки/части кода или объекты потребляют большую часть памяти. Поиск в Google показывает, коммерческую составляет Валидатор Памяти Python (только для Windows).
и с открытым исходным кодом являются PySizer и Heapy.
Я никого не пробовал, поэтому я хотел знать, какой из них лучше всего рассмотреть:
дает больше всего подробности.
Мне нужно сделать минимум или никаких изменений в моем коде.
8 ответов:
Heapy довольно проста в использовании. В какой-то момент в коде, вы должны написать следующее:
from guppy import hpy h = hpy() print h.heap()
это дает вам некоторые выходные данные, как это:
Partition of a set of 132527 objects. Total size = 8301532 bytes. Index Count % Size % Cumulative % Kind (class / dict of class) 0 35144 27 2140412 26 2140412 26 str 1 38397 29 1309020 16 3449432 42 tuple 2 530 0 739856 9 4189288 50 dict (no owner)
вы также можете узнать, откуда ссылаются объекты и получить статистику об этом, но каким-то образом документы на это немного разрежены.
есть также графический браузер, написанный в ТЗ.
поскольку никто не упомянул об этом, я укажу на мой модуль memory_profiler который способен печатать построчный отчет об использовании памяти и работает на Unix и Windows (нуждается в psutil на этом последнем). Вывод не очень подробный, но цель состоит в том, чтобы дать вам обзор того, где код потребляет больше памяти, а не исчерпывающий анализ выделенных объектов.
после украшения вашей функции с
@profile
и запуск вашего кода с помощью-m memory_profiler
флаг это будет напечатан построчный отчет, как это:Line # Mem usage Increment Line Contents ============================================== 3 @profile 4 5.97 MB 0.00 MB def my_func(): 5 13.61 MB 7.64 MB a = [1] * (10 ** 6) 6 166.20 MB 152.59 MB b = [2] * (2 * 10 ** 7) 7 13.61 MB -152.59 MB del b 8 13.61 MB 0.00 MB return a
рекомендую колдун. Это очень легко настроить, и вам нужно ноль изменений в коде. Вы можете просматривать количество объектов каждого типа во времени, просматривать список живых объектов, просматривать ссылки на живые объекты, все из простого веб-интерфейса.
# memdebug.py import cherrypy import dowser def start(port): cherrypy.tree.mount(dowser.Root()) cherrypy.config.update({ 'environment': 'embedded', 'server.socket_port': port }) cherrypy.server.quickstart() cherrypy.engine.start(blocking=False)
вы импортируете memdebug и вызываете memdebug.начать. Вот и все.
Я не пробовал PySizer или Heapy. Я был бы признателен другим' обзоры.
обновление
приведенный выше код для
CherryPy 2.X
,CherryPy 3.X
theserver.quickstart
метод был удален, иengine.start
не взятьblocking
флаг. Так что если вы используетеCherryPy 3.X
# memdebug.py import cherrypy import dowser def start(port): cherrypy.tree.mount(dowser.Root()) cherrypy.config.update({ 'environment': 'embedded', 'server.socket_port': port }) cherrypy.engine.start()
рассмотрим objgraph библиотека (см. http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks для примера использования).
Muppy Это (еще один) профилировщик использования памяти для Python. Основное внимание в этом наборе инструментов уделяется выявлению утечек памяти.
Маппи пытается помочь разработчикам идентифицировать утечки памяти приложений Python. Это позволяет отслеживать использование памяти во время выполнения и идентификацию объектов, которые протекают. Кроме того, предоставляются инструменты, которые позволяют найти источник не выпустили объектов.
Я разрабатываю профилировщик памяти для Python называется цепью утилит средство определения:
http://jmdana.github.io/memprof/
Это позволяет вам регистрировать и строить график использования памяти ваших переменных во время выполнения украшенных методов. Вам просто нужно импортировать библиотеку с помощью:
from memprof import memprof
и украсить ваш метод с помощью:
@memprof
это пример того, как выглядят сюжеты:
проект размещается в GitHub:
попробуйте также проект pytracemalloc который обеспечивает использование памяти на номер строки Python.
EDIT (2014/04): теперь у него есть графический интерфейс Qt для анализа снимков.