Какой профилировщик памяти Python рекомендуется?
Я хочу знать использование памяти моего приложения Python и особенно хочу знать, какие блоки кода / части или объекты потребляют больше всего памяти. Поисковая система Google показывает коммерческий Python Memory Validator (только для 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)
Вы также можете узнать, откуда ссылаются объекты, и получить статистику об этом, но каким-то образом документы по этому вопросу немного скудны.
Существует также графический браузер, написанный на Tk.
Поскольку никто не упомянул об этом, я укажу на мой модуль 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.start. Это все.
Я не пробовал PySizer или Heapy. Буду признателен за отзывы других.
ОБНОВИТЬ
Код выше для CherryPy 2.X
, CherryPy 3.X
server.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 под названием memprof:
http://jmdana.github.io/memprof/
Это позволяет вам регистрировать и отображать использование памяти вашими переменными во время выполнения декорированных методов. Вам просто нужно импортировать библиотеку, используя:
from memprof import memprof
И украсьте свой метод, используя:
@memprof
Это пример того, как выглядят графики:
Проект размещен на GitHub:
Попробуйте также проект pytracemalloc, который обеспечивает использование памяти на номер строки Python.
РЕДАКТИРОВАТЬ (2014/04): теперь он имеет графический интерфейс Qt для анализа снимков.