Документация Python неофициальный перевод

tracemalloc.md

515 строк · 33.9 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.4/library/tracemalloc.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 27.7. [`tracemalloc`](https://python-all.ru/3.4/library/tracemalloc.html#module-tracemalloc) – Отслеживание выделений памяти89Новое в версии 3.4.1011Модуль tracemalloc – инструмент отладки для трассировки блоков памяти, выделяемых Python. Он предоставляет следующую информацию:1213- Трассировка места выделения объекта14- Статистика по выделенным блокам памяти для каждого имени файла и номера строки: общий размер, количество и средний размер выделенных блоков памяти15- Вычисление различий между двумя снимками для обнаружения утечек памяти1617Для отслеживания большинства блоков памяти, выделяемых Python, модуль следует запускать как можно раньше, установив переменную окружения [`PYTHONTRACEMALLOC`](https://python-all.ru/3.4/using/cmdline.html#envvar-PYTHONTRACEMALLOC) в значение `1` или используя параметр командной строки [*-X*](https://python-all.ru/3.4/using/cmdline.html#cmdoption-X) `tracemalloc`. Функцию [`tracemalloc.start()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.start) можно вызвать во время выполнения, чтобы начать отслеживание выделений памяти Python.1819По умолчанию трассировка выделенного блока памяти хранит только самый последний кадр (1 кадр). Чтобы хранить 25 кадров при запуске: установите переменную окружения [`PYTHONTRACEMALLOC`](https://python-all.ru/3.4/using/cmdline.html#envvar-PYTHONTRACEMALLOC) в значение `25` или используйте параметр командной строки [*-X*](https://python-all.ru/3.4/using/cmdline.html#cmdoption-X) `tracemalloc=25`.2021## 27.7.1. Примеры2223### 27.7.1.1. Отображение топ-102425Показать 10 файлов, выделяющих больше всего памяти:2627```python28import tracemalloc2930tracemalloc.start()3132# ... запустить приложение ...3334snapshot = tracemalloc.take_snapshot()35top_stats = snapshot.statistics('lineno')3637print("[ Top 10 ]")38for stat in top_stats[:10]:39    print(stat)40```4142Пример вывода тестового набора Python:4344```python45[ Top 10 ]46<frozen importlib._bootstrap>:716: size=4855 KiB, count=39328, average=126 B47<frozen importlib._bootstrap>:284: size=521 KiB, count=3199, average=167 B48/usr/lib/python3.4/collections/__init__.py:368: size=244 KiB, count=2315, average=108 B49/usr/lib/python3.4/unittest/case.py:381: size=185 KiB, count=779, average=243 B50/usr/lib/python3.4/unittest/case.py:402: size=154 KiB, count=378, average=416 B51/usr/lib/python3.4/abc.py:133: size=88.7 KiB, count=347, average=262 B52<frozen importlib._bootstrap>:1446: size=70.4 KiB, count=911, average=79 B53<frozen importlib._bootstrap>:1454: size=52.0 KiB, count=25, average=2131 B54<string>:5: size=49.7 KiB, count=148, average=344 B55/usr/lib/python3.4/sysconfig.py:411: size=48.0 KiB, count=1, average=48.0 KiB56```5758Мы видим, что Python загрузил `4.8 MiB` данных (байт-код и константы) из модулей, а модуль [`collections`](https://python-all.ru/3.4/library/collections.html#module-collections) выделил `244 KiB` для построения типов [`namedtuple`](https://python-all.ru/3.4/library/collections.html#collections.namedtuple).5960Смотрите [`Snapshot.statistics()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot.statistics) для получения дополнительных параметров.6162### 27.7.1.2. Вычисление различий6364Сделать два снимка и отобразить различия:6566```python67import tracemalloc68tracemalloc.start()69# ... запустить приложение ...7071snapshot1 = tracemalloc.take_snapshot()72# ... вызвать функцию, приводящую к утечке памяти ...73snapshot2 = tracemalloc.take_snapshot()7475top_stats = snapshot2.compare_to(snapshot1, 'lineno')7677print("[ Top 10 differences ]")78for stat in top_stats[:10]:79    print(stat)80```8182Пример вывода до и после запуска некоторых тестов из набора тестов Python:8384```python85[ Top 10 differences ]86<frozen importlib._bootstrap>:716: size=8173 KiB (+4428 KiB), count=71332 (+39369), average=117 B87/usr/lib/python3.4/linecache.py:127: size=940 KiB (+940 KiB), count=8106 (+8106), average=119 B88/usr/lib/python3.4/unittest/case.py:571: size=298 KiB (+298 KiB), count=589 (+589), average=519 B89<frozen importlib._bootstrap>:284: size=1005 KiB (+166 KiB), count=7423 (+1526), average=139 B90/usr/lib/python3.4/mimetypes.py:217: size=112 KiB (+112 KiB), count=1334 (+1334), average=86 B91/usr/lib/python3.4/http/server.py:848: size=96.0 KiB (+96.0 KiB), count=1 (+1), average=96.0 KiB92/usr/lib/python3.4/inspect.py:1465: size=83.5 KiB (+83.5 KiB), count=109 (+109), average=784 B93/usr/lib/python3.4/unittest/mock.py:491: size=77.7 KiB (+77.7 KiB), count=143 (+143), average=557 B94/usr/lib/python3.4/urllib/parse.py:476: size=71.8 KiB (+71.8 KiB), count=969 (+969), average=76 B95/usr/lib/python3.4/contextlib.py:38: size=67.2 KiB (+67.2 KiB), count=126 (+126), average=546 B96```9798Мы видим, что Python загрузил `8.2 MiB` данных модулей (байт-код и константы), и это на `4.4 MiB` больше, чем было загружено до тестов, когда был сделан предыдущий снимок. Аналогично, модуль [`linecache`](https://python-all.ru/3.4/library/linecache.html#module-linecache) кэшировал `940 KiB` исходного кода Python для форматирования трассировок стека, всё это со времени предыдущего снимка.99100Если в системе мало свободной памяти, снимки можно записать на диск с помощью метода [`Snapshot.dump()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot.dump) для последующего офлайн-анализа. Затем используйте метод [`Snapshot.load()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot.load) для перезагрузки снимка.101102### 27.7.1.3. Получение трассировки блока памяти103104Код для отображения трассировки самого большого блока памяти:105106```python107import tracemalloc108109# Сохранить 25 фреймов110tracemalloc.start(25)111112# ... запустить приложение ...113114snapshot = tracemalloc.take_snapshot()115top_stats = snapshot.statistics('traceback')116117# выбрать самый большой блок памяти118stat = top_stats[0]119print("%s memory blocks: %.1f KiB" % (stat.count, stat.size / 1024))120for line in stat.traceback.format():121    print(line)122```123124Пример вывода набора тестов Python (трассировка ограничена 25 кадрами):125126```python127903 memory blocks: 870.1 KiB128  File "<frozen importlib._bootstrap>", line 716129  File "<frozen importlib._bootstrap>", line 1036130  File "<frozen importlib._bootstrap>", line 934131  File "<frozen importlib._bootstrap>", line 1068132  File "<frozen importlib._bootstrap>", line 619133  File "<frozen importlib._bootstrap>", line 1581134  File "<frozen importlib._bootstrap>", line 1614135  File "/usr/lib/python3.4/doctest.py", line 101136    import pdb137  File "<frozen importlib._bootstrap>", line 284138  File "<frozen importlib._bootstrap>", line 938139  File "<frozen importlib._bootstrap>", line 1068140  File "<frozen importlib._bootstrap>", line 619141  File "<frozen importlib._bootstrap>", line 1581142  File "<frozen importlib._bootstrap>", line 1614143  File "/usr/lib/python3.4/test/support/__init__.py", line 1728144    import doctest145  File "/usr/lib/python3.4/test/test_pickletools.py", line 21146    support.run_doctest(pickletools)147  File "/usr/lib/python3.4/test/regrtest.py", line 1276148    test_runner()149  File "/usr/lib/python3.4/test/regrtest.py", line 976150    display_failure=not verbose)151  File "/usr/lib/python3.4/test/regrtest.py", line 761152    match_tests=ns.match_tests)153  File "/usr/lib/python3.4/test/regrtest.py", line 1563154    main()155  File "/usr/lib/python3.4/test/__main__.py", line 3156    regrtest.main_in_temp_cwd()157  File "/usr/lib/python3.4/runpy.py", line 73158    exec(code, run_globals)159  File "/usr/lib/python3.4/runpy.py", line 160160    "__main__", fname, loader, pkg_name)161```162163Мы видим, что больше всего памяти было выделено в модуле [`importlib`](https://python-all.ru/3.4/library/importlib.html#module-importlib) для загрузки данных (байт-код и константы) из модулей: `870 KiB`. Трассировка показывает, где модуль [`importlib`](https://python-all.ru/3.4/library/importlib.html#module-importlib) загружал данные в последний раз: на строке `import pdb` модуля [`doctest`](https://python-all.ru/3.4/library/doctest.html#module-doctest). Трассировка может измениться, если будет загружен новый модуль.164165### 27.7.1.4. Красивый вывод топ166167Код для отображения 10 строк, выделяющих больше всего памяти, с красивым выводом, игнорируя файлы `<frozen importlib._bootstrap>` и `<unknown>`:168169```python170import linecache171import os172import tracemalloc173174def display_top(snapshot, group_by='lineno', limit=10):175    snapshot = snapshot.filter_traces((176        tracemalloc.Filter(False, "<frozen importlib._bootstrap>"),177        tracemalloc.Filter(False, "<unknown>"),178    ))179    top_stats = snapshot.statistics(group_by)180181    print("Top %s lines" % limit)182    for index, stat in enumerate(top_stats[:limit], 1):183        frame = stat.traceback[0]184        # замените "/path/to/module/file.py" на "module/file.py"185        filename = os.sep.join(frame.filename.split(os.sep)[-2:])186        print("#%s: %s:%s: %.1f KiB"187              % (index, filename, frame.lineno, stat.size / 1024))188        line = linecache.getline(frame.filename, frame.lineno).strip()189        if line:190            print('    %s' % line)191192    other = top_stats[limit:]193    if other:194        size = sum(stat.size for stat in other)195        print("%s other: %.1f KiB" % (len(other), size / 1024))196    total = sum(stat.size for stat in top_stats)197    print("Total allocated size: %.1f KiB" % (total / 1024))198199tracemalloc.start()200201# ... запустить приложение ...202203snapshot = tracemalloc.take_snapshot()204display_top(snapshot)205```206207Пример вывода тестового набора Python:208209```python210Top 10 lines211#1: Lib/base64.py:414: 419.8 KiB212    _b85chars2 = [(a + b) for a in _b85chars for b in _b85chars]213#2: Lib/base64.py:306: 419.8 KiB214    _a85chars2 = [(a + b) for a in _a85chars for b in _a85chars]215#3: collections/__init__.py:368: 293.6 KiB216    exec(class_definition, namespace)217#4: Lib/abc.py:133: 115.2 KiB218    cls = super().__new__(mcls, name, bases, namespace)219#5: unittest/case.py:574: 103.1 KiB220    testMethod()221#6: Lib/linecache.py:127: 95.4 KiB222    lines = fp.readlines()223#7: urllib/parse.py:476: 71.8 KiB224    for a in _hexdig for b in _hexdig}225#8: <string>:5: 62.0 KiB226#9: Lib/_weakrefset.py:37: 60.0 KiB227    self.data = set()228#10: Lib/base64.py:142: 59.8 KiB229    _b32tab2 = [a + b for a in _b32tab for b in _b32tab]2306220 other: 3602.8 KiB231Total allocated size: 5303.1 KiB232```233234Смотрите [`Snapshot.statistics()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot.statistics) для получения дополнительных параметров.235236## 27.7.2. API237238### 27.7.2.1. Функции239240#### `tracemalloc.clear_traces()`241242Очищает записи о блоках памяти, выделенных Python.243244Смотрите также [`stop()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.stop).245246#### `tracemalloc.get_object_traceback(obj)`247248Получает трассировку, где был выделен объект Python *obj*. Возвращает экземпляр [`Traceback`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Traceback) или `None`, если модуль [`tracemalloc`](https://python-all.ru/3.4/library/tracemalloc.html#module-tracemalloc) не отслеживает выделения памяти или не отследил выделение этого объекта.249250Смотрите также функции [`gc.get_referrers()`](https://python-all.ru/3.4/library/gc.html#gc.get_referrers) и [`sys.getsizeof()`](https://python-all.ru/3.4/library/sys.html#sys.getsizeof).251252#### `tracemalloc.get_traceback_limit()`253254Возвращает максимальное количество фреймов, сохраняемых в трассировке записи.255256Модуль [`tracemalloc`](https://python-all.ru/3.4/library/tracemalloc.html#module-tracemalloc) должен отслеживать выделения памяти, чтобы получить ограничение, в противном случае возбуждается исключение.257258Ограничение задаётся функцией [`start()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.start).259260#### `tracemalloc.get_traced_memory()`261262Получает текущий размер и пиковый размер блоков памяти, отслеживаемых модулем [`tracemalloc`](https://python-all.ru/3.4/library/tracemalloc.html#module-tracemalloc), в виде кортежа: `(current: int, peak: int)`.263264#### `tracemalloc.get_tracemalloc_memory()`265266Получает объём памяти в байтах, используемый модулем [`tracemalloc`](https://python-all.ru/3.4/library/tracemalloc.html#module-tracemalloc) для хранения трасс блоков памяти. Возвращает [`int`](https://python-all.ru/3.4/library/functions.html#int).267268#### `tracemalloc.is_tracing()`269270`True`, если модуль [`tracemalloc`](https://python-all.ru/3.4/library/tracemalloc.html#module-tracemalloc) отслеживает выделения памяти Python, в противном случае `False`.271272Смотрите также функции [`start()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.start) и [`stop()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.stop).273274#### `tracemalloc.start(nframe: int=1)`275276Начинает отслеживание выделения памяти Python: устанавливает перехватчики в распределители памяти Python. Собираемые трассировки записей будут ограничены *nframe* фреймами. По умолчанию запись блока памяти хранит только самый последний фрейм: ограничение равно `1`. Значение *nframe* должно быть больше или равно `1`.277278Хранение более `1` кадра полезно только для вычисления статистики, сгруппированной по `'traceback'`, или для вычисления кумулятивной статистики: смотрите методы [`Snapshot.compare_to()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot.compare_to) и [`Snapshot.statistics()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot.statistics).279280Хранение большего количества кадров увеличивает нагрузку на память и процессор модуля [`tracemalloc`](https://python-all.ru/3.4/library/tracemalloc.html#module-tracemalloc). Используйте функцию [`get_tracemalloc_memory()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.get_tracemalloc_memory), чтобы измерить, сколько памяти использует модуль [`tracemalloc`](https://python-all.ru/3.4/library/tracemalloc.html#module-tracemalloc).281282Переменная окружения [`PYTHONTRACEMALLOC`](https://python-all.ru/3.4/using/cmdline.html#envvar-PYTHONTRACEMALLOC) (`PYTHONTRACEMALLOC=NFRAME`) и параметр командной строки [*-X*](https://python-all.ru/3.4/using/cmdline.html#cmdoption-X) `tracemalloc=NFRAME` могут использоваться для запуска трассировки при старте.283284Смотрите также функции [`stop()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.stop), [`is_tracing()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.is_tracing) и [`get_traceback_limit()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.get_traceback_limit).285286#### `tracemalloc.stop()`287288Останавливает трассировку выделений памяти Python: удаляет хуки на аллокаторах памяти Python. Также очищает все ранее собранные трассы блоков памяти, выделенных Python.289290Вызовите функцию [`take_snapshot()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.take_snapshot), чтобы сделать снимок трасс перед очисткой.291292Смотрите также [`start()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.start), [`is_tracing()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.is_tracing) и [`clear_traces()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.clear_traces) функции.293294#### `tracemalloc.take_snapshot()`295296Делает снимок трасс блоков памяти, выделенных Python. Возвращает новый [`Snapshot`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot) экземпляр.297298Снимок не включает блоки памяти, выделенные до того, как модуль [`tracemalloc`](https://python-all.ru/3.4/library/tracemalloc.html#module-tracemalloc) начал отслеживать выделения памяти.299300Трассировки трасс ограничены [`get_traceback_limit()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.get_traceback_limit) кадрами. Используйте параметр *nframe* функции [`start()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.start) для хранения большего количества кадров.301302Модуль [`tracemalloc`](https://python-all.ru/3.4/library/tracemalloc.html#module-tracemalloc) должен отслеживать выделения памяти, чтобы сделать снимок; см. функцию [`start()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.start).303304См. также функцию [`get_object_traceback()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.get_object_traceback).305306### 27.7.2.2. Фильтр307308#### `class tracemalloc.Filter(inclusive: bool, filename_pattern: str, lineno: int=None, all_frames: bool=False)`309310Фильтр для следов блоков памяти.311312См. функцию [`fnmatch.fnmatch()`](https://python-all.ru/3.4/library/fnmatch.html#fnmatch.fnmatch) для синтаксиса *filename\_pattern*. Расширения файлов `'.pyc'` и `'.pyo'` заменяются на `'.py'`.313314Примеры:315316- `Filter(True, subprocess.__file__)` включает только трассы модуля [`subprocess`](https://python-all.ru/3.4/library/subprocess.html#module-subprocess)317- `Filter(False, tracemalloc.__file__)` исключает трассы модуля [`tracemalloc`](https://python-all.ru/3.4/library/tracemalloc.html#module-tracemalloc)318- `Filter(False, "<unknown>")` исключает пустые трассировки319320#### `inclusive`321322Если *inclusive* равно `True` (включение), отслеживаются только те блоки памяти, которые выделены в файле, имя которого соответствует [`filename_pattern`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Filter.filename_pattern), в строке с номером [`lineno`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Filter.lineno).323324Если *inclusive* равно `False` (исключение), игнорируются блоки памяти, выделенные в файле, имя которого соответствует [`filename_pattern`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Filter.filename_pattern), в строке с номером [`lineno`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Filter.lineno).325326#### `lineno`327328Номер строки (`int`) фильтра. Если *lineno* равно `None`, фильтр соответствует любому номеру строки.329330#### `filename_pattern`331332Шаблон имени файла фильтра (`str`).333334#### `all_frames`335336Если *all\_frames* равно `True`, проверяются все кадры трассировки. Если *all\_frames* равно `False`, проверяется только самый последний кадр.337338Этот атрибут не действует, если предел трассировки равен `1`. См. функцию [`get_traceback_limit()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.get_traceback_limit) и [`Snapshot.traceback_limit`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot.traceback_limit) атрибут.339340### 27.7.2.3. Кадр341342#### `class tracemalloc.Frame`343344Фрейм трассировки.345346Класс [`Traceback`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Traceback) представляет собой последовательность экземпляров [`Frame`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Frame).347348#### `filename`349350Имя файла (`str`).351352#### `lineno`353354Номер строки (`int`).355356### 27.7.2.4. Снимок357358#### `class tracemalloc.Snapshot`359360Снимок трасс блоков памяти, выделенных Python.361362Функция [`take_snapshot()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.take_snapshot) создаёт экземпляр снимка.363364#### `compare_to(old_snapshot: Snapshot, group_by: str, cumulative: bool=False)`365366Вычисляет различия со старым снимком. Возвращает статистику в виде отсортированного списка экземпляров [`StatisticDiff`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.StatisticDiff), сгруппированных по *group\_by*.367368См. метод [`Snapshot.statistics()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot.statistics) для параметров *group\_by* и *cumulative* .369370Результат сортируется от наибольшего к наименьшему по: абсолютному значению [`StatisticDiff.size_diff`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.StatisticDiff.size_diff), [`StatisticDiff.size`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.StatisticDiff.size), абсолютному значению [`StatisticDiff.count_diff`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.StatisticDiff.count_diff), [`Statistic.count`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Statistic.count) и затем по [`StatisticDiff.traceback`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.StatisticDiff.traceback).371372#### `dump(filename)`373374Записывает снимок в файл.375376Используйте [`load()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot.load) для перезагрузки снимка.377378#### `filter_traces(filters)`379380Создаёт новый экземпляр [`Snapshot`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot) с отфильтрованной последовательностью [`traces`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot.traces); *filters* – это список экземпляров [`Filter`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Filter). Если *filters* – пустой список, возвращает новый экземпляр [`Snapshot`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot) с копией трассировок.381382Все включающие фильтры применяются одновременно; трасса игнорируется, если ни один включающий фильтр ей не соответствует. Трасса также игнорируется, если ей соответствует хотя бы один исключающий фильтр.383384#### `classmethod load(filename)`385386Загружает снимок из файла.387388См. также [`dump()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot.dump).389390#### `statistics(group_by: str, cumulative: bool=False)`391392Возвращает статистику в виде отсортированного списка экземпляров [`Statistic`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Statistic), сгруппированных по *group\_by*:393394| group\_by | описание |395| --- | --- |396| `'filename'` | filename |397| `'lineno'` | имя файла и номер строки |398| `'traceback'` | трассировка |399400Если *cumulative* равно `True`, суммируются размер и количество блоков памяти всех кадров трассировки, а не только самого последнего кадра. Кумулятивный режим можно использовать только с *group\_by*, равным `'filename'` и `'lineno'`.401402Результат сортируется от наибольшего к наименьшему по: [`Statistic.size`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Statistic.size), [`Statistic.count`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Statistic.count) и затем по [`Statistic.traceback`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Statistic.traceback).403404#### `traceback_limit`405406Максимальное количество кадров, хранящихся в трассировке [`traces`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot.traces): результат вызова [`get_traceback_limit()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.get_traceback_limit) на момент создания снимка.407408#### `traces`409410Трассировки всех блоков памяти, выделенных Python: последовательность экземпляров [`Trace`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Trace).411412Последовательность не упорядочена. Используйте метод [`Snapshot.statistics()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot.statistics) для получения отсортированного списка статистик.413414### 27.7.2.5. Статистика415416#### `class tracemalloc.Statistic`417418Статистика по выделениям памяти.419420[`Snapshot.statistics()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot.statistics) возвращает список экземпляров [`Statistic`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Statistic).421422См. также класс [`StatisticDiff`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.StatisticDiff).423424#### `count`425426Количество блоков памяти (`int`).427428#### `size`429430Общий размер блоков памяти в байтах (`int`).431432#### `traceback`433434Traceback, где был выделен блок памяти, [`Traceback`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Traceback) экземпляр.435436### 27.7.2.6. Статистика различий437438#### `class tracemalloc.StatisticDiff`439440Статистическая разница распределений памяти между старым и новым экземпляром [`Snapshot`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot).441442[`Snapshot.compare_to()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot.compare_to) возвращает список [`StatisticDiff`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.StatisticDiff) экземпляров. См. также класс [`Statistic`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Statistic).443444#### `count`445446Количество блоков памяти в новом снимке (`int`): `0`, если блоки памяти освобождены в новом снимке.447448#### `count_diff`449450Разница в количестве блоков памяти между старым и новым снимками (`int`): `0`, если блоки памяти были выделены в новом снимке.451452#### `size`453454Общий размер блоков памяти в байтах в новом снимке (`int`): `0`, если блоки памяти освобождены в новом снимке.455456#### `size_diff`457458Разница общего размера блоков памяти в байтах между старым и новым снимками (`int`): `0`, если блоки памяти были выделены в новом снимке.459460#### `traceback`461462Traceback, где были выделены блоки памяти, [`Traceback`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Traceback) экземпляр.463464### 27.7.2.7. Трасса465466#### `class tracemalloc.Trace`467468Трассировка блока памяти.469470Атрибут [`Snapshot.traces`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Snapshot.traces) представляет собой последовательность [`Trace`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Trace) экземпляров.471472#### `size`473474Размер блока памяти в байтах (`int`).475476#### `traceback`477478Traceback, где был выделен блок памяти, [`Traceback`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Traceback) экземпляр.479480### 27.7.2.8. Traceback481482#### `class tracemalloc.Traceback`483484Последовательность экземпляров [`Frame`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Frame), отсортированных от самого нового фрейма до самого старого.485486Объект traceback содержит как минимум `1` фрейм. Если модуль `tracemalloc` не смог получить фрейм, используется имя файла `"<unknown>"` с номером строки `0`.487488При создании снимка трассировки traceback ограничиваются [`get_traceback_limit()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.get_traceback_limit) фреймами. См. функцию [`take_snapshot()`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.take_snapshot).489490Атрибут [`Trace.traceback`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Trace.traceback) является экземпляром [`Traceback`](https://python-all.ru/3.4/library/tracemalloc.html#tracemalloc.Traceback) .491492#### `format(limit=None)`493494Форматирует объект traceback как список строк с переводами строк. Для получения строк исходного кода используется модуль [`linecache`](https://python-all.ru/3.4/library/linecache.html#module-linecache). Если задан *limit*, форматируются только *limit* последних фреймов.495496Похожа на функцию [`traceback.format_tb()`](https://python-all.ru/3.4/library/traceback.html#traceback.format_tb), за исключением того, что [`format()`](https://python-all.ru/3.4/library/functions.html#format) не включает символы новой строки.497498Пример:499500```python501print("Traceback (most recent call first):")502for line in traceback:503    print(line)504```505506Вывод:507508```python509Traceback (most recent call first):510  File "test.py", line 9511    obj = Object()512  File "test.py", line 12513    tb = tracemalloc.get_object_traceback(f())514```515