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

tracemalloc.md

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

1> **Источник:** https://python-all.ru/3.5/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.5/library/tracemalloc.html#module-tracemalloc) – Трассировка выделений памяти89Новое в версии 3.4.1011**Исходный код:** [Lib/tracemalloc.py](https://python-all.ru/src/3.5/Lib/tracemalloc.py)1213---1415Модуль tracemalloc – инструмент отладки для трассировки блоков памяти, выделяемых Python. Он предоставляет следующую информацию:1617- Трассировка места выделения объекта18- Статистика по выделенным блокам памяти для каждого имени файла и номера строки: общий размер, количество и средний размер выделенных блоков памяти19- Вычисление различий между двумя снимками для обнаружения утечек памяти2021Чтобы трассировать большинство блоков памяти, выделяемых Python, модуль следует запускать как можно раньше, установив переменную окружения [`PYTHONTRACEMALLOC`](https://python-all.ru/3.5/using/cmdline.html#envvar-PYTHONTRACEMALLOC) в `1` или используя опцию командной строки [`-X`](https://python-all.ru/3.5/using/cmdline.html#id5) `tracemalloc`. Функцию [`tracemalloc.start()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.start) можно вызвать во время выполнения, чтобы начать трассировку выделений памяти Python.2223По умолчанию трасса выделенного блока памяти сохраняет только самый последний кадр (1 кадр). Чтобы сохранить 25 кадров при запуске: установите переменную окружения [`PYTHONTRACEMALLOC`](https://python-all.ru/3.5/using/cmdline.html#envvar-PYTHONTRACEMALLOC) в `25` или используйте опцию командной строки [`-X`](https://python-all.ru/3.5/using/cmdline.html#id5) `tracemalloc=25`.2425## 27.7.1. Примеры2627### 27.7.1.1. Отображение топ-102829Показать 10 файлов, выделяющих больше всего памяти:3031```python32import tracemalloc3334tracemalloc.start()3536# ... запустить приложение ...3738snapshot = tracemalloc.take_snapshot()39top_stats = snapshot.statistics('lineno')4041print("[ Top 10 ]")42for stat in top_stats[:10]:43    print(stat)44```4546Пример вывода тестового набора Python:4748```python49[ Top 10 ]50<frozen importlib._bootstrap>:716: size=4855 KiB, count=39328, average=126 B51<frozen importlib._bootstrap>:284: size=521 KiB, count=3199, average=167 B52/usr/lib/python3.4/collections/__init__.py:368: size=244 KiB, count=2315, average=108 B53/usr/lib/python3.4/unittest/case.py:381: size=185 KiB, count=779, average=243 B54/usr/lib/python3.4/unittest/case.py:402: size=154 KiB, count=378, average=416 B55/usr/lib/python3.4/abc.py:133: size=88.7 KiB, count=347, average=262 B56<frozen importlib._bootstrap>:1446: size=70.4 KiB, count=911, average=79 B57<frozen importlib._bootstrap>:1454: size=52.0 KiB, count=25, average=2131 B58<string>:5: size=49.7 KiB, count=148, average=344 B59/usr/lib/python3.4/sysconfig.py:411: size=48.0 KiB, count=1, average=48.0 KiB60```6162Мы видим, что Python загрузил `4855 KiB` данных (байт-код и константы) из модулей, а модуль [`collections`](https://python-all.ru/3.5/library/collections.html#module-collections) выделил `244 KiB` для построения типов [`namedtuple`](https://python-all.ru/3.5/library/collections.html#collections.namedtuple).6364Дополнительные параметры см. в [`Snapshot.statistics()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot.statistics).6566### 27.7.1.2. Вычисление различий6768Сделать два снимка и отобразить различия:6970```python71import tracemalloc72tracemalloc.start()73# ... запустить приложение ...7475snapshot1 = tracemalloc.take_snapshot()76# ... вызвать функцию, приводящую к утечке памяти ...77snapshot2 = tracemalloc.take_snapshot()7879top_stats = snapshot2.compare_to(snapshot1, 'lineno')8081print("[ Top 10 differences ]")82for stat in top_stats[:10]:83    print(stat)84```8586Пример вывода до и после запуска некоторых тестов из набора тестов Python:8788```python89[ Top 10 differences ]90<frozen importlib._bootstrap>:716: size=8173 KiB (+4428 KiB), count=71332 (+39369), average=117 B91/usr/lib/python3.4/linecache.py:127: size=940 KiB (+940 KiB), count=8106 (+8106), average=119 B92/usr/lib/python3.4/unittest/case.py:571: size=298 KiB (+298 KiB), count=589 (+589), average=519 B93<frozen importlib._bootstrap>:284: size=1005 KiB (+166 KiB), count=7423 (+1526), average=139 B94/usr/lib/python3.4/mimetypes.py:217: size=112 KiB (+112 KiB), count=1334 (+1334), average=86 B95/usr/lib/python3.4/http/server.py:848: size=96.0 KiB (+96.0 KiB), count=1 (+1), average=96.0 KiB96/usr/lib/python3.4/inspect.py:1465: size=83.5 KiB (+83.5 KiB), count=109 (+109), average=784 B97/usr/lib/python3.4/unittest/mock.py:491: size=77.7 KiB (+77.7 KiB), count=143 (+143), average=557 B98/usr/lib/python3.4/urllib/parse.py:476: size=71.8 KiB (+71.8 KiB), count=969 (+969), average=76 B99/usr/lib/python3.4/contextlib.py:38: size=67.2 KiB (+67.2 KiB), count=126 (+126), average=546 B100```101102Мы видим, что Python загрузил `8173 KiB` данных модулей (байт-кода и констант), и это на `4428 KiB` больше, чем было загружено до тестов, когда был сделан предыдущий снимок. Аналогично, модуль [`linecache`](https://python-all.ru/3.5/library/linecache.html#module-linecache) закешировал `940 KiB` исходного кода Python для форматирования трассировок – всё это с момента предыдущего снимка.103104Если в системе мало свободной памяти, снимки можно записать на диск с помощью метода [`Snapshot.dump()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot.dump) для анализа снимка в автономном режиме. Затем используйте метод [`Snapshot.load()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot.load) для перезагрузки снимка.105106### 27.7.1.3. Получение трассировки блока памяти107108Код для отображения трассировки самого большого блока памяти:109110```python111import tracemalloc112113# Сохранить 25 фреймов114tracemalloc.start(25)115116# ... запустить приложение ...117118snapshot = tracemalloc.take_snapshot()119top_stats = snapshot.statistics('traceback')120121# выбрать самый большой блок памяти122stat = top_stats[0]123print("%s memory blocks: %.1f KiB" % (stat.count, stat.size / 1024))124for line in stat.traceback.format():125    print(line)126```127128Пример вывода набора тестов Python (трассировка ограничена 25 кадрами):129130```python131903 memory blocks: 870.1 KiB132  File "<frozen importlib._bootstrap>", line 716133  File "<frozen importlib._bootstrap>", line 1036134  File "<frozen importlib._bootstrap>", line 934135  File "<frozen importlib._bootstrap>", line 1068136  File "<frozen importlib._bootstrap>", line 619137  File "<frozen importlib._bootstrap>", line 1581138  File "<frozen importlib._bootstrap>", line 1614139  File "/usr/lib/python3.4/doctest.py", line 101140    import pdb141  File "<frozen importlib._bootstrap>", line 284142  File "<frozen importlib._bootstrap>", line 938143  File "<frozen importlib._bootstrap>", line 1068144  File "<frozen importlib._bootstrap>", line 619145  File "<frozen importlib._bootstrap>", line 1581146  File "<frozen importlib._bootstrap>", line 1614147  File "/usr/lib/python3.4/test/support/__init__.py", line 1728148    import doctest149  File "/usr/lib/python3.4/test/test_pickletools.py", line 21150    support.run_doctest(pickletools)151  File "/usr/lib/python3.4/test/regrtest.py", line 1276152    test_runner()153  File "/usr/lib/python3.4/test/regrtest.py", line 976154    display_failure=not verbose)155  File "/usr/lib/python3.4/test/regrtest.py", line 761156    match_tests=ns.match_tests)157  File "/usr/lib/python3.4/test/regrtest.py", line 1563158    main()159  File "/usr/lib/python3.4/test/__main__.py", line 3160    regrtest.main_in_temp_cwd()161  File "/usr/lib/python3.4/runpy.py", line 73162    exec(code, run_globals)163  File "/usr/lib/python3.4/runpy.py", line 160164    "__main__", fname, loader, pkg_name)165```166167Мы видим, что больше всего памяти было выделено в модуле [`importlib`](https://python-all.ru/3.5/library/importlib.html#module-importlib) для загрузки данных (байт-кода и констант) из модулей: `870.1 KiB`. Трассировка указывает место, где модуль [`importlib`](https://python-all.ru/3.5/library/importlib.html#module-importlib) загрузил данные последний раз: на `import pdb` строке модуля [`doctest`](https://python-all.ru/3.5/library/doctest.html#module-doctest). Трассировка может измениться, если будет загружен новый модуль.168169### 27.7.1.4. Красивый вывод топ170171Код для отображения 10 строк с наибольшим выделением памяти в удобном формате, игнорируя файлы `<frozen importlib._bootstrap>` и `<unknown>`:172173```python174import linecache175import os176import tracemalloc177178def display_top(snapshot, key_type='lineno', limit=10):179    snapshot = snapshot.filter_traces((180        tracemalloc.Filter(False, "<frozen importlib._bootstrap>"),181        tracemalloc.Filter(False, "<unknown>"),182    ))183    top_stats = snapshot.statistics(key_type)184185    print("Top %s lines" % limit)186    for index, stat in enumerate(top_stats[:limit], 1):187        frame = stat.traceback[0]188        # замените "/path/to/module/file.py" на "module/file.py"189        filename = os.sep.join(frame.filename.split(os.sep)[-2:])190        print("#%s: %s:%s: %.1f KiB"191              % (index, filename, frame.lineno, stat.size / 1024))192        line = linecache.getline(frame.filename, frame.lineno).strip()193        if line:194            print('    %s' % line)195196    other = top_stats[limit:]197    if other:198        size = sum(stat.size for stat in other)199        print("%s other: %.1f KiB" % (len(other), size / 1024))200    total = sum(stat.size for stat in top_stats)201    print("Total allocated size: %.1f KiB" % (total / 1024))202203tracemalloc.start()204205# ... запустить приложение ...206207snapshot = tracemalloc.take_snapshot()208display_top(snapshot)209```210211Пример вывода тестового набора Python:212213```python214Top 10 lines215#1: Lib/base64.py:414: 419.8 KiB216    _b85chars2 = [(a + b) for a in _b85chars for b in _b85chars]217#2: Lib/base64.py:306: 419.8 KiB218    _a85chars2 = [(a + b) for a in _a85chars for b in _a85chars]219#3: collections/__init__.py:368: 293.6 KiB220    exec(class_definition, namespace)221#4: Lib/abc.py:133: 115.2 KiB222    cls = super().__new__(mcls, name, bases, namespace)223#5: unittest/case.py:574: 103.1 KiB224    testMethod()225#6: Lib/linecache.py:127: 95.4 KiB226    lines = fp.readlines()227#7: urllib/parse.py:476: 71.8 KiB228    for a in _hexdig for b in _hexdig}229#8: <string>:5: 62.0 KiB230#9: Lib/_weakrefset.py:37: 60.0 KiB231    self.data = set()232#10: Lib/base64.py:142: 59.8 KiB233    _b32tab2 = [a + b for a in _b32tab for b in _b32tab]2346220 other: 3602.8 KiB235Total allocated size: 5303.1 KiB236```237238Дополнительные параметры см. в [`Snapshot.statistics()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot.statistics).239240## 27.7.2. API241242### 27.7.2.1. Функции243244#### `tracemalloc.clear_traces()`245246Очищает записи о блоках памяти, выделенных Python.247248См. также [`stop()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.stop).249250#### `tracemalloc.get_object_traceback(obj)`251252Возвращает трассировку, где был выделен объект Python *obj*. Возвращает экземпляр [`Traceback`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Traceback) или `None`, если модуль [`tracemalloc`](https://python-all.ru/3.5/library/tracemalloc.html#module-tracemalloc) не отслеживает выделения памяти или не отслеживал выделение данного объекта.253254См. также функции [`gc.get_referrers()`](https://python-all.ru/3.5/library/gc.html#gc.get_referrers) и [`sys.getsizeof()`](https://python-all.ru/3.5/library/sys.html#sys.getsizeof).255256#### `tracemalloc.get_traceback_limit()`257258Возвращает максимальное количество фреймов, сохраняемых в трассировке записи.259260Модуль [`tracemalloc`](https://python-all.ru/3.5/library/tracemalloc.html#module-tracemalloc) должен отслеживать выделения памяти, чтобы получить ограничение, иначе возбуждается исключение.261262Ограничение устанавливается функцией [`start()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.start).263264#### `tracemalloc.get_traced_memory()`265266Возвращает текущий размер и пиковый размер блоков памяти, отслеживаемых модулем [`tracemalloc`](https://python-all.ru/3.5/library/tracemalloc.html#module-tracemalloc), в виде кортежа: `(current: int, peak: int)`.267268#### `tracemalloc.get_tracemalloc_memory()`269270Возвращает объём памяти в байтах, используемый модулем [`tracemalloc`](https://python-all.ru/3.5/library/tracemalloc.html#module-tracemalloc) для хранения записей о блоках памяти. Возвращает [`int`](https://python-all.ru/3.5/library/functions.html#int).271272#### `tracemalloc.is_tracing()`273274`True`, если модуль [`tracemalloc`](https://python-all.ru/3.5/library/tracemalloc.html#module-tracemalloc) отслеживает выделения памяти Python, иначе `False`.275276См. также функции [`start()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.start) и [`stop()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.stop).277278#### `tracemalloc.start(nframe: int=1)`279280Начинает отслеживание выделения памяти Python: устанавливает перехватчики в распределители памяти Python. Собираемые трассировки записей будут ограничены *nframe* фреймами. По умолчанию запись блока памяти хранит только самый последний фрейм: ограничение равно `1`. Значение *nframe* должно быть больше или равно `1`.281282Хранение более `1` фреймов имеет смысл только для вычисления статистики, сгруппированной по `'traceback'`, или для вычисления накопительной статистики: см. методы [`Snapshot.compare_to()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot.compare_to) и [`Snapshot.statistics()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot.statistics).283284Хранение большего числа фреймов увеличивает потребление памяти и загрузку процессора модулем [`tracemalloc`](https://python-all.ru/3.5/library/tracemalloc.html#module-tracemalloc). Используйте функцию [`get_tracemalloc_memory()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.get_tracemalloc_memory), чтобы измерить, сколько памяти использует модуль [`tracemalloc`](https://python-all.ru/3.5/library/tracemalloc.html#module-tracemalloc).285286Переменная окружения [`PYTHONTRACEMALLOC`](https://python-all.ru/3.5/using/cmdline.html#envvar-PYTHONTRACEMALLOC) (`PYTHONTRACEMALLOC=NFRAME`) и опция командной строки [`-X`](https://python-all.ru/3.5/using/cmdline.html#id5) `tracemalloc=NFRAME` могут использоваться для запуска отслеживания при старте.287288См. также функции [`stop()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.stop), [`is_tracing()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.is_tracing) и [`get_traceback_limit()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.get_traceback_limit).289290#### `tracemalloc.stop()`291292Останавливает трассировку выделений памяти Python: удаляет хуки на аллокаторах памяти Python. Также очищает все ранее собранные трассы блоков памяти, выделенных Python.293294Необходимо вызвать функцию [`take_snapshot()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.take_snapshot), чтобы сделать снимок трасс перед их очисткой.295296См. также функции [`start()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.start), [`is_tracing()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.is_tracing) и [`clear_traces()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.clear_traces).297298#### `tracemalloc.take_snapshot()`299300Делает снимок трасс блоков памяти, выделенных Python. Возвращает новый экземпляр [`Snapshot`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot).301302Снимок не включает блоки памяти, выделенные до того, как модуль [`tracemalloc`](https://python-all.ru/3.5/library/tracemalloc.html#module-tracemalloc) начал трассировку выделений памяти.303304Трассировки следов ограничены [`get_traceback_limit()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.get_traceback_limit) кадрами. Для хранения большего количества кадров используется параметр *nframe* функции [`start()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.start).305306Модуль [`tracemalloc`](https://python-all.ru/3.5/library/tracemalloc.html#module-tracemalloc) должен трассировать выделения памяти, чтобы сделать снимок. См. функцию [`start()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.start).307308См. также функцию [`get_object_traceback()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.get_object_traceback).309310### 27.7.2.2. Фильтр311312#### `class tracemalloc.Filter(inclusive: bool, filename_pattern: str, lineno: int=None, all_frames: bool=False)`313314Фильтр для следов блоков памяти.315316См. функцию [`fnmatch.fnmatch()`](https://python-all.ru/3.5/library/fnmatch.html#fnmatch.fnmatch) для синтаксиса *filename\_pattern*. Расширение файла `'.pyc'` заменяется на `'.py'`.317318Примеры:319320- `Filter(True, subprocess.__file__)` включает только следы модуля [`subprocess`](https://python-all.ru/3.5/library/subprocess.html#module-subprocess)321- `Filter(False, tracemalloc.__file__)` исключает следы модуля [`tracemalloc`](https://python-all.ru/3.5/library/tracemalloc.html#module-tracemalloc)322- `Filter(False, "<unknown>")` исключает пустые трассировки323324Изменено в версии 3.5: Расширение файла `'.pyo'` больше не заменяется на `'.py'`.325326#### `inclusive`327328Если *inclusive* равно `True` (включение), то трассируются только блоки памяти, выделенные в файле, имя которого соответствует [`filename_pattern`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Filter.filename_pattern), на строке [`lineno`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Filter.lineno).329330Если *inclusive* равно `False` (исключить), игнорировать блоки памяти, выделенные в файле с именем, соответствующим [`filename_pattern`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Filter.filename_pattern), по номеру строки [`lineno`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Filter.lineno).331332#### `lineno`333334Номер строки (`int`) фильтра. Если *lineno* равно `None`, фильтр соответствует любому номеру строки.335336#### `filename_pattern`337338Шаблон имени файла фильтра (`str`).339340#### `all_frames`341342Если *all\_frames* равно `True`, проверяются все фреймы трассировки. Если *all\_frames* равно `False`, проверяется только самый последний фрейм.343344Этот атрибут не действует, если предел трассировки равен `1`. См. функцию [`get_traceback_limit()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.get_traceback_limit) и атрибут [`Snapshot.traceback_limit`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot.traceback_limit).345346### 27.7.2.3. Кадр347348#### `class tracemalloc.Frame`349350Фрейм трассировки.351352Класс [`Traceback`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Traceback) представляет собой последовательность экземпляров [`Frame`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Frame).353354#### `filename`355356Имя файла (`str`).357358#### `lineno`359360Номер строки (`int`).361362### 27.7.2.4. Снимок363364#### `class tracemalloc.Snapshot`365366Снимок трасс блоков памяти, выделенных Python.367368Функция [`take_snapshot()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.take_snapshot) создает экземпляр снимка.369370#### `compare_to(old_snapshot: Snapshot, key_type: str, cumulative: bool=False)`371372Вычисляет различия со старым снимком. Возвращает статистику в виде отсортированного списка экземпляров [`StatisticDiff`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.StatisticDiff), сгруппированных по *key\_type*.373374См. метод [`Snapshot.statistics()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot.statistics) для параметров *key\_type* и *cumulative*.375376Результат отсортирован от наибольшего к наименьшему по: абсолютному значению [`StatisticDiff.size_diff`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.StatisticDiff.size_diff), [`StatisticDiff.size`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.StatisticDiff.size), абсолютному значению [`StatisticDiff.count_diff`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.StatisticDiff.count_diff), [`Statistic.count`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Statistic.count) и затем по [`StatisticDiff.traceback`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.StatisticDiff.traceback).377378#### `dump(filename)`379380Записывает снимок в файл.381382Снимок перезагружается с помощью [`load()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot.load).383384#### `filter_traces(filters)`385386Создаёт новый экземпляр [`Snapshot`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot) с отфильтрованной последовательностью [`traces`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot.traces). Параметр *filters* – это список экземпляров [`Filter`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Filter). Если *filters* является пустым списком, возвращается новый экземпляр [`Snapshot`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot) с копией трассировок.387388Все включающие фильтры применяются одновременно; трасса игнорируется, если ни один включающий фильтр ей не соответствует. Трасса также игнорируется, если ей соответствует хотя бы один исключающий фильтр.389390#### `classmethod load(filename)`391392Загружает снимок из файла.393394См. также [`dump()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot.dump).395396#### `statistics(key_type: str, cumulative: bool=False)`397398Возвращает статистику в виде отсортированного списка экземпляров [`Statistic`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Statistic), сгруппированных по *key\_type*:399400| key\_type | описание |401| --- | --- |402| `'filename'` | filename |403| `'lineno'` | имя файла и номер строки |404| `'traceback'` | трассировка |405406Если *cumulative* равно `True`, накапливать размер и количество блоков памяти для всех фреймов трассировки (traceback) трассы, а не только самого последнего фрейма. Режим накопления можно использовать только с *key\_type*, равным `'filename'` и `'lineno'`.407408Результат сортируется от наибольшего к наименьшему по: [`Statistic.size`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Statistic.size), [`Statistic.count`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Statistic.count), а затем по [`Statistic.traceback`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Statistic.traceback).409410#### `traceback_limit`411412Максимальное количество фреймов, хранящихся в traceback [`traces`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot.traces): результат [`get_traceback_limit()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.get_traceback_limit) на момент создания снимка.413414#### `traces`415416Трассы всех блоков памяти, выделенных Python: последовательность экземпляров [`Trace`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Trace).417418Последовательность имеет неопределённый порядок. Используйте метод [`Snapshot.statistics()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot.statistics) для получения отсортированного списка статистики.419420### 27.7.2.5. Статистика421422#### `class tracemalloc.Statistic`423424Статистика по выделениям памяти.425426[`Snapshot.statistics()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot.statistics) возвращает список экземпляров [`Statistic`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Statistic).427428См. также класс [`StatisticDiff`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.StatisticDiff).429430#### `count`431432Количество блоков памяти (`int`).433434#### `size`435436Общий размер блоков памяти в байтах (`int`).437438#### `traceback`439440Трассировка, где был выделен блок памяти, экземпляр [`Traceback`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Traceback).441442### 27.7.2.6. Статистика различий443444#### `class tracemalloc.StatisticDiff`445446Разница статистики по выделениям памяти между старым и новым экземпляром [`Snapshot`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot).447448[`Snapshot.compare_to()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot.compare_to) возвращает список экземпляров [`StatisticDiff`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.StatisticDiff). См. также класс [`Statistic`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Statistic).449450#### `count`451452Количество блоков памяти в новом снимке (`int`): `0`, если блоки памяти были освобождены в новом снимке.453454#### `count_diff`455456Разница количества блоков памяти между старым и новым снимками (`int`): `0`, если блоки памяти были выделены в новом снимке.457458#### `size`459460Общий размер блоков памяти в байтах в новом снимке (`int`): `0`, если блоки памяти были освобождены в новом снимке.461462#### `size_diff`463464Разница в общем размере блоков памяти в байтах между старым и новым снимками (`int`): `0`, если блоки памяти были выделены в новом снимке.465466#### `traceback`467468Трассировка, где были выделены блоки памяти, экземпляр [`Traceback`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Traceback).469470### 27.7.2.7. Трасса471472#### `class tracemalloc.Trace`473474Трассировка блока памяти.475476Атрибут [`Snapshot.traces`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Snapshot.traces) – это последовательность [`Trace`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Trace) экземпляров.477478#### `size`479480Размер блока памяти в байтах (`int`).481482#### `traceback`483484Трассировка, где был выделен блок памяти, экземпляр [`Traceback`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Traceback).485486### 27.7.2.8. Traceback487488#### `class tracemalloc.Traceback`489490Последовательность экземпляров [`Frame`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Frame), отсортированных от самого последнего кадра к самому старому.491492Трассировка содержит как минимум `1` кадр. Если модуль `tracemalloc` не смог получить кадр, используется имя файла `"<unknown>"` на строке `0`.493494При создании снимка трассировки записей ограничиваются [`get_traceback_limit()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.get_traceback_limit) кадрами. См. функцию [`take_snapshot()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.take_snapshot).495496Атрибут [`Trace.traceback`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Trace.traceback) является экземпляром [`Traceback`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Traceback).497498#### `format(limit=None)`499500Форматирует трассировку как список строк с переводами строк. Используйте модуль [`linecache`](https://python-all.ru/3.5/library/linecache.html#module-linecache) для получения строк из исходного кода. Если задан *limit*, форматирует только *limit* самых последних кадров.501502Аналогично функции [`traceback.format_tb()`](https://python-all.ru/3.5/library/traceback.html#traceback.format_tb), за исключением того, что [`format()`](https://python-all.ru/3.5/library/tracemalloc.html#tracemalloc.Traceback.format) не включает символы новой строки.503504Пример:505506```python507print("Traceback (most recent call first):")508for line in traceback:509    print(line)510```511512Вывод:513514```python515Traceback (most recent call first):516  File "test.py", line 9517    obj = Object()518  File "test.py", line 12519    tb = tracemalloc.get_object_traceback(f())520```521