Який профілер пам'яті Python рекомендується використовувати? [зачинено]


670

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

І з відкритим кодом - PySizer та Heapy .

Я нікого не пробував, тому хотів дізнатися, хто з них найкращий:

  1. Дає більшість деталей.

  2. Я повинен робити чи не міняти свій код.


2
Для пошуку джерел витоків рекомендую objgraph.
пі.

9
@MikeiLL Є місце для таких питань: Рекомендації щодо програмного забезпечення
Poik

2
Це відбувається досить часто, щоб ми могли замість цього перенести одне питання на інший форум.
zabumba

Одна порада: якщо хтось використовує 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об'єктів, було б непогано побачити кілька прикладів!
амос

34
Станом на 06.07.2014, guppy не підтримує Python 3.
Quentin Pradet

5
Є вилка guppy, яка підтримує 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

Я рекомендую 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. Буду вдячний за відгуки інших.

ОНОВЛЕННЯ

Вище код для 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()

3
але це тільки для вишневого, як це використовувати з грішним сценарієм?
Anurag Uniyal

13
Це не для CherryPy. Подумайте про CherryPy як інструментарій GUI.
sanxiyn

1
fwiw, сторінка pysizer pysizer.8325.org, здається, рекомендує важкі, які, як кажуть, схожі
Jacob Gabrielson

6
Існує загальний WSGI порт Dowser під назвою Dozer, який ви також можете використовувати з іншими веб-серверами: pypi.python.org/pypi/Dozer
Джо Шоу

2
cherrypy 3.1 видалено cherrypy.server.quickstart (), тому просто використовуйте cherrypy.engine.start ()
MatsLindh

66

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


7
objgraph допоміг мені вирішити проблему з витоком пам'яті, з якою я стикався сьогодні. objgraph.show_growth () був особливо корисним
Ngure Nyaga

1
Я теж вважав objgraph дуже корисним. Ви можете робити такі речі, як objgraph.by_type('dict')зрозуміти, звідки dictберуться всі ці несподівані об’єкти.
Діно

18

Muppy - це (ще один) Профілер використання пам'яті для Python. Цей набір інструментів зосереджено на виявленні витоків пам'яті.

Muppy намагається допомогти розробникам у витоку пам’яті ідентичності програм Python. Це дозволяє відстежувати використання пам'яті під час виконання та виявляти об'єкти, що протікають. Додатково надаються інструменти, які дозволяють знайти джерело не випущених об'єктів.


13

Я розробляю профайл пам'яті для Python під назвою memprof:

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

Це дозволяє реєструвати та побудувати графік використання пам'яті ваших змінних під час виконання декорованих методів. Вам просто потрібно імпортувати бібліотеку за допомогою:

from memprof import memprof

І прикрасьте свій метод, використовуючи:

@memprof

Це приклад того, як виглядають сюжети:

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

Проект розміщується в GitHub:

https://github.com/jmdana/memprof


3
Як я ним користуюся? Що таке a, b, c?
tommy.carstensen

@ Tommy.carstensen a, bі cімена змінних. Ви можете знайти документацію на сайті github.com/jmdana/memprof . Якщо у вас є якісь запитання, будь ласка, надішліть проблему в github або надішліть електронний лист до списку розсилки, який можна знайти в документації.
jmdana

12

Я знайшов Мелію бути набагато більш функціональною , ніж безформна або PySizer. Якщо вам трапиться бути запущений WSGI веб - додаток, а потім бульдозер хороший проміжного обгортка Dowser


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.