Какой профилировщик памяти Python рекомендуется?[закрыто]
-
02-07-2019 - |
Вопрос
Я хочу знать использование памяти моим приложением Python и, в частности, хочу знать, какие блоки/части кода или объекты потребляют больше всего памяти.Поиск Google показывает, что это коммерческий вариант. Валидатор памяти Python (Только для Windows).
И с открытым исходным кодом PySizer и тяжелый.
Я никого не пробовал, поэтому хотел знать, какой из них лучше, учитывая:
Дает больше всего подробностей.
Мне нужно вносить минимум изменений или вообще не вносить их в свой код.
Решение
тяжелый довольно прост в использовании.В какой-то момент вашего кода вам нужно написать следующее:
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.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()
Рассмотрим объектный график библиотека (см. http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks для примера варианта использования).
Муппи это (еще один) профилировщик использования памяти для Python.Основное внимание в этом наборе инструментов уделяется выявлению утечек памяти.
Muppy пытается помочь разработчикам выявить утечки памяти в приложениях Python.Это позволяет отслеживать использование памяти во время выполнения и выявлять объекты, которые имеют утечку.Кроме того, предоставляются инструменты, позволяющие определить источник невыпущенных объектов.
Я разрабатываю профилировщик памяти для Python под названием memprof:
http://jmdana.github.io/memprof/
Он позволяет вам регистрировать и отображать использование памяти вашими переменными во время выполнения декорированных методов.Вам просто нужно импортировать библиотеку, используя:
from memprof import memprof
И украсьте свой метод, используя:
@memprof
Вот пример того, как выглядят графики:
Проект размещен на GitHub:
Попробуйте также проект pytracemalloc который обеспечивает использование памяти на номер строки Python.
РЕДАКТИРОВАТЬ (2014/04):Теперь у него есть графический интерфейс Qt для анализа снимков.