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

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

И с открытым исходным кодом PySizer и Heapy.

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

  1. Дает большинство деталей.

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

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:

https://github.com/jmdana/memprof

Я обнаружил, что мелиа гораздо функциональнее, чем Heapy или PySizer. Если вы работаете с веб-приложением wsgi, то Dozer - это прекрасная промежуточная оболочка Dowser.

Попробуйте также проект pytracemalloc, который обеспечивает использование памяти на номер строки Python.

РЕДАКТИРОВАТЬ (2014/04): теперь он имеет графический интерфейс Qt для анализа снимков.

Другие вопросы по тегам