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

StackOverflow https://stackoverflow.com/questions/110259

Вопрос

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

И с открытым исходным кодом PySizer и тяжелый.

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

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

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

Это было полезно?

Решение

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

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)

Вы также можете узнать, откуда ссылаются объекты, и получить об этом статистику, но почему-то документации по этому вопросу немного скудно.

Также имеется графический браузер, написанный на Тк.

Другие советы

Поскольку никто об этом не упомянул, я укажу на свой модуль. 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()

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

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

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

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

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

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

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

from memprof import memprof

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

@memprof

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

enter image description here

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

https://github.com/jmdana/memprof

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top