Вопрос-Ответ

Which Python memory profiler is recommended? [closed]

Какой профилировщик памяти Python рекомендуется?

Я хочу знать, как используется память моего приложения на Python, и, в частности, хочу знать, какие блоки / части кода или объекты потребляют больше всего памяти. Поиск в Google показывает, что коммерческим является Python Memory Validator (только для Windows).

А открытыми исходными кодами являются PySizer и Heapy.

Я никого не пробовал, поэтому хотел узнать, какой из них лучше всего подходит.:


  1. Содержит наиболее подробную информацию.


  2. Я должен вносить минимум изменений в свой код или вообще не вносить их.


Переведено автоматически
Ответ 1

Мой модуль 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
Ответ 2

guppy3 довольно прост в использовании. В какой-то момент вашего кода вы должны написать следующее:

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.

Для Python 2.x используйте Heapy.

Ответ 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. Я был бы признателен за отзывы других.

Обновить

Приведенный выше код предназначен для 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 (пример использования см. в этом сообщении в блоге).

python performance