Вопрос по memory-management, performance, profiling, python – Какой профилировщик памяти Python рекомендуется? [закрыто]

623

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

И с открытым исходным кодом являютсяPySizer а такжебесформенный.

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

Gives most details.

I have to do least or no changes to my code.

иметь этот комментарий видимым, но закрытым - это ужасно - люди все еще используют его, чтобы получить рекомендации по инструментам профилирования, поскольку он является одним из самых популярных хитов Google. рекомендуюpympler zzzeek
Для поиска источников утечек я рекомендую использовать objgraph. pi.
Один совет: если кто-то использует gae и хочет проверить использование памяти - это большая головная боль, потому что эти инструменты ничего не выводили или событие не началось. Если вы хотите проверить что-то маленькое, переместите функцию, которую вы хотите протестировать, в отдельный файл и запустите этот файл в одиночку. alexche8
@MikeiLL Есть место для таких вопросов:Software Recommendations Poik
Это происходит достаточно часто, чтобы мы могли вместо этого перенести один вопрос на другой форум. zabumba

Ваш Ответ

8   ответов
64

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

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

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

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

from memprof import memprof

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

@memprof

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

enter image description here

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

https://github.com/jmdana/memprof

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

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

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

16

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

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

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

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()
fwiw, страница pysizerpysizer.8325.org кажется, рекомендую кучу, которая говорит, что это похоже
Существует общий порт Dowser для WSGI, называемый Dozer, который можно использовать и с другими веб-серверами: pypi.python.org/pypi/Dozer.
Это не для CherryPy. Думайте о CherryPy как о наборе инструментов GUI.
но это только для cherrypy, как использовать его с скриптом sinple? Anurag Uniyal
cherrypy 3.1 удалено cherrypy.server.quickstart (), поэтому просто используйте cherrypy.engine.start ()
7

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

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

tracemalloc теперь является частью стандартной библиотеки Python. Увидетьdocs.python.org/3/library/tracemalloc.html
268

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

Это дает вам некоторый вывод, как это:

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.

к сожалению, похоже, что он не собирается или не устанавливается в OSX .. 10.4, по крайней мере.
По состоянию на 2014-07-06 гуппи не поддерживает Python 3.
Если вы пользуетесь Python 2.7, вам может потребоваться его магистральная версия:sourceforge.net/tracker/…, pip install https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy
Кучные документы ... не очень хорошие. Но я нашел этот пост очень полезным для начала:smira.ru/wp-content/uploads/2011/08/heapy.html
Обратите внимание, что heapy не включает память, выделенную в расширениях Python. Если кто-то разработал механизм для включения в негоboost::python объекты, было бы неплохо увидеть несколько примеров!

Похожие вопросы