Какой профайлер памяти Python рекомендуется?
Я хочу знать использование памяти моего приложения Python и особенно хочу знать, какие блоки/части или объекты кода потребляют большую часть памяти.
Поиск в Google показывает коммерческий Python Memory Validator (только для Windows).
И с открытым исходным кодом PySizer и Heapy.
Я никого не пробовал, поэтому хотел узнать, какой из них лучше всего рассмотреть:
Ответы
Ответ 1
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.
Ответ 2
Поскольку никто не упомянул об этом, я укажу на свой модуль 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
Ответ 3
Я рекомендую Dowser. Его очень легко настроить, и вам нужны нулевые изменения в коде. Вы можете просматривать количество объектов каждого типа во времени, просматривать список живых объектов, просматривать ссылки на живые объекты, все из простого веб-интерфейса.
# 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. Я был бы признателен за отзывы других пользователей.
UPDATE
Вышеприведенный код предназначен для 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()
Ответ 4
Рассмотрим библиотеку objgraph (см. http://www.lshift.nethttps://stackoverflow.com/blog/2008/11/14/tracing-python-memory-leaks для примера использования).
Ответ 5
Muppy является (еще одним) профилировщиком использования памяти для Python. В центре внимания этого набора инструментов лежит идентификация утечек памяти.
Muppy пытается помочь разработчикам в утечках памяти идентификаторов приложений Python. Он позволяет отслеживать использование памяти во время выполнения и идентификацию объектов, которые протекают. Кроме того, предоставляются инструменты, которые позволяют находить источник незапущенных объектов.
Ответ 6
Я нашел meliae более функциональным, чем Heapy или PySizer. Если вы запускаете wsgi webapp, то Dozer - это хорошая промежуточная оболочка Dowser
Ответ 7
Я разрабатываю профилировщик памяти для Python с именем memprof:
http://jmdana.github.io/memprof/
Позволяет записывать и записывать использование памяти ваших переменных во время выполнения декорированных методов. Вам просто нужно импортировать библиотеку, используя:
from memprof import memprof
И украсьте свой метод, используя:
@memprof
Это пример того, как выглядят графики:
![enter image description here]()
Проект размещен в GitHub:
https://github.com/jmdana/memprof
Ответ 8
Попробуйте также проект pytracemalloc, который обеспечивает использование памяти на номер строки Python.
EDIT (2014/04): теперь у него есть Qt GUI для анализа моментальных снимков.