Какой профайлер памяти 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()

Ответ 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 для анализа моментальных снимков.