Which Python memory profiler is recommended? [closed]
Какой профилировщик памяти Python рекомендуется?
Я хочу знать, как используется память моего приложения на Python, и, в частности, хочу знать, какие блоки / части кода или объекты потребляют больше всего памяти. Поиск в Google показывает, что коммерческим является Python Memory Validator (только для Windows).
А открытыми исходными кодами являются PySizer и Heapy.
Я никого не пробовал, поэтому хотел узнать, какой из них лучше всего подходит.:
Содержит наиболее подробную информацию.
Я должен вносить минимум изменений в свой код или вообще не вносить их.
Переведено автоматически
Ответ 1
Мой модуль memory_profiler способен печатать построчный отчет об использовании памяти и работает в Unix и Windows (для последнего требуется psutil). Выходные данные не очень подробные, но цель состоит в том, чтобы дать вам обзор того, где код потребляет больше памяти, а не исчерпывающий анализ выделенных объектов.
После оформления вашей функции с помощью @profile и запуска вашего кода с -m memory_profiler флагом, он напечатает построчный отчет, подобный этому:
Line # Mem usage Increment Line Contents ============================================== 3 @profile 45.97 MB 0.00 MB defmy_func(): 513.61 MB 7.64 MB a = [1] * (10 ** 6) 6166.20 MB 152.59 MB b = [2] * (2 * 10 ** 7) 713.61 MB -152.59 MB del b 813.61 MB 0.00 MB return a
Ответ 2
guppy3 довольно прост в использовании. В какой-то момент вашего кода вы должны написать следующее:
from guppy import hpy h = hpy() print(h.heap())
Это дает вам примерно такой результат:
Partition of a set of 132527 objects. Total size = 8301532bytes. Index Count % Size % Cumulative % Kind (class / dict of class) 03514427214041226214041226str 13839729130902016344943242tuple 253007398569418928850dict (no owner)
Вы также можете узнать, откуда берутся ссылки на объекты, и получить статистику об этом, но почему-то документов по этому вопросу немного мало.
Я рекомендую Dowser. Его очень легко настроить, и вам не нужно вносить никаких изменений в ваш код. Вы можете просматривать количество объектов каждого типа во времени, просматривать список живых объектов, просматривать ссылки на живые объекты, и все это с помощью простого веб-интерфейса.
# memdebug.py
import cherrypy import dowser
defstart(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.Xserver.quickstart метод был удален и engine.start не принимает blocking флаг. Поэтому, если вы используете CherryPy 3.X
# memdebug.py
import cherrypy import dowser
defstart(port): cherrypy.tree.mount(dowser.Root()) cherrypy.config.update({ 'environment': 'embedded', 'server.socket_port': port }) cherrypy.engine.start()