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

671

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

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

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

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

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

Анураг Униял
источник
2
Для поиска источников утечек я рекомендую использовать objgraph.
пи.
9
@MikeiLL Есть место для таких вопросов: Рекомендации по программному обеспечению
Poik
2
Это происходит достаточно часто, чтобы мы могли вместо этого перенести один вопрос на другой форум.
Забумба
Один совет: если кто-то использует gae to и хочет проверить использование памяти - это большая головная боль, потому что эти инструменты ничего не выводили или событие не запускалось. Если вы хотите проверить что-то маленькое, переместите функцию, которую вы хотите протестировать, в отдельный файл и запустите этот файл в одиночку.
alexche8
4
Я рекомендую Pympler
zzzeek

Ответы:

288

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.

Торстен Марек
источник
24
Если вы используете Python 2.7, вам может потребоваться его магистральная версия: sourceforge.net/tracker/… ,pip install https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy
Джеймс Снайдер,
27
Кучные документы ... не очень хорошие. Но я нашел этот пост очень полезным для начала работы: smira.ru/wp-content/uploads/2011/08/heapy.html
Джо Шоу,
4
Обратите внимание, что heapy не включает память, выделенную в расширениях Python. Если бы кто-нибудь разработал механизм, позволяющий включать boost::pythonобъекты, то было бы неплохо увидеть некоторые примеры!
amos
34
По состоянию на 2014-07-06 гуппи не поддерживает Python 3.
Квентин Прадет
5
Есть форк гуппи, который поддерживает Python 3, называется guppy3.
Дэвид Фостер
385

Поскольку никто не упомянул об этом, я укажу на мой модуль 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
Фабиан Педрегоса
источник
1
Для моего сценария - простой скрипт для работы с изображениями, а не сложная система, в которой некоторые курсоры оставались открытыми - это было лучшее решение. Очень просто заглянуть и понять, что происходит, с минимальным добавлением к вашему коду. Идеально подходит для быстрых исправлений и, вероятно, отлично подходит для других приложений.
Driftcatcher
10
Я считаю memory_profiler действительно простым и удобным в использовании. Я хочу сделать профилирование для каждой строки, а не для объекта. Спасибо, что написали.
tommy.carstensen
1
@FabianPedregosa, как доза memory_profiler обрабатывает циклы, может ли он идентифицировать номер итерации цикла?
Глен Флетчер
3
Он идентифицирует циклы только неявно, когда он пытается сообщить количество строк за строкой, и находит дублированные строки. В этом случае это займет максимум всех итераций.
Фабиан Педрегоса
1
@FabianPedregosa Буферизует memory_profilerсвой вывод? Возможно, я что-то делаю не так, но кажется, что вместо завершения вывода профиля для функции, когда она завершается, он ожидает завершения сценария.
Greenstick
80

Я рекомендую Доусер . Это очень легко установить, и вам нужно ноль изменений в вашем коде. Вы можете просматривать количество объектов каждого типа во времени, просматривать список живых объектов, просматривать ссылки на живые объекты, все из простого веб-интерфейса.

# 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.Xserver.quickstartengine.startblockingCherryPy 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()
sanxiyn
источник
3
но это только для cherrypy, как использовать его с скриптом sinple?
Anurag Uniyal
13
Это не для CherryPy. Думайте о CherryPy как о наборе инструментов GUI.
sanxiyn
1
fwiw, страница pysizer pysizer.8325.org, кажется, рекомендует heapy, который, как он говорит, похож
Jacob Gabrielson
6
Существует общий порт Dowser для WSGI, называемый Dozer, который можно использовать и с другими веб-серверами: pypi.python.org/pypi/Dozer
Джо Шоу,
2
cherrypy 3.1 удалено cherrypy.server.quickstart (), поэтому просто используйте cherrypy.engine.start ()
MatsLindh
66

Рассмотрим библиотеку objgraph (см.http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks для примера использования).

Чарльз Даффи
источник
7
objgraph помог мне решить проблему утечки памяти, с которой я столкнулся сегодня. objgraph.show_growth () был особенно полезен
Нгуре Няга
1
Я тоже нашел objgraph действительно полезным. Вы можете делать такие вещи, как objgraph.by_type('dict')понять, откуда взялись все эти неожиданные dictобъекты.
Дино
18

Muppy - это (еще один) памяти для Python. Основное внимание в этом наборе инструментов уделяется выявлению утечек памяти.

Маппи пытается помочь разработчикам идентифицировать утечки памяти приложений Python. Это позволяет отслеживать использование памяти во время выполнения и идентифицировать объекты, которые протекают. Кроме того, предусмотрены инструменты, позволяющие определить местонахождение не выпущенных объектов.

Serrano
источник
13

Я разрабатываю профилировщик памяти для Python под названием memprof:

http://jmdana.github.io/memprof/

Это позволяет вам регистрировать и отображать использование памяти ваших переменных во время выполнения декорированных методов. Вам просто нужно импортировать библиотеку, используя:

from memprof import memprof

И украсьте свой метод, используя:

@memprof

Это пример того, как выглядят графики:

введите описание изображения здесь

Проект размещен на GitHub:

https://github.com/jmdana/memprof

jmdana
источник
3
Как мне это использовать? Что такое а, б, в?
tommy.carstensen
@ tommy.carstensen a, bи cимена переменных. Вы можете найти документацию по адресу github.com/jmdana/memprof . Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь отправлять сообщения в github или отправлять электронную почту в список рассылки, который можно найти в документации.
Джмдана
12

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

Кален Пеннингтон
источник
8

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

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

haypo
источник
4
tracemallocтеперь является частью стандартной библиотеки Python. См. Docs.python.org/3/library/tracemalloc.html
Дэн Милон,