perfmaps.md
1> **Источник:** https://python-all.ru/3.15/c-api/perfmaps.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Поддержка Perf Maps89На поддерживаемых платформах (Linux и macOS) среда выполнения может использовать *файлы perf map*, чтобы сделать функции Python видимыми для внешнего профилировщика (например, [perf](https://python-all.ru/3.15/c-api/perfmaps.html) или [samply](https://python-all.ru/3.15/c-api/perfmaps.html)). Запущенный процесс может создать файл в каталоге `/tmp`, содержащий записи, которые сопоставляют участок исполняемого кода с именем. Этот интерфейс описан в [документации инструмента Linux Perf](https://python-all.ru/3.15/c-api/perfmaps.html).1011В Python эти вспомогательные API могут использоваться библиотеками и возможностями, которые генерируют машинный код на лету.1213Обратите внимание, что для этих API не требуется удерживать [присоединённое состояние потока](https://python-all.ru/3.15/glossary.html#term-attached-thread-state).1415#### `int PyUnstable_PerfMapState_Init(void)`1617> *Это [нестабильное API](https://python-all.ru/3.15/c-api/stable.html#unstable-c-api). Оно может меняться без предупреждения в минорных версиях.*1819Открывает файл `/tmp/perf-$pid.map`, если он ещё не открыт, и создаёт блокировку для обеспечения потокобезопасной записи в файл (при условии, что записи выполняются через [`PyUnstable_WritePerfMapEntry()`](https://python-all.ru/3.15/c-api/perfmaps.html#c.PyUnstable_WritePerfMapEntry)). Обычно нет необходимости вызывать эту функцию явно; просто используйте `PyUnstable_WritePerfMapEntry()`, и она инициализирует состояние при первом вызове.2021Возвращает `0` при успехе, `-1` при неудаче создания/открытия файла perf map или `-2` при неудаче создания блокировки. Проверьте `errno` для получения дополнительной информации о причине сбоя.2223#### `int PyUnstable_WritePerfMapEntry(const void *code_addr, size_t code_size, const char *entry_name)`2425> *Это [нестабильное API](https://python-all.ru/3.15/c-api/stable.html#unstable-c-api). Оно может меняться без предупреждения в минорных версиях.*2627Записывает одну запись в файл `/tmp/perf-$pid.map`. Эта функция потокобезопасна. Вот как выглядит пример записи:2829```c30# address size name317f3529fcf759 b py::bar:/run/t.py32```3334Вызовет [`PyUnstable_PerfMapState_Init()`](https://python-all.ru/3.15/c-api/perfmaps.html#c.PyUnstable_PerfMapState_Init) перед записью записи, если файл perf map ещё не открыт. Возвращает `0` при успехе или те же коды ошибок, что и `PyUnstable_PerfMapState_Init()`, при неудаче.3536#### `void PyUnstable_PerfMapState_Fini(void)`3738> *Это [нестабильное API](https://python-all.ru/3.15/c-api/stable.html#unstable-c-api). Оно может меняться без предупреждения в минорных версиях.*3940Закрывает файл perf map, открытый с помощью [`PyUnstable_PerfMapState_Init()`](https://python-all.ru/3.15/c-api/perfmaps.html#c.PyUnstable_PerfMapState_Init). Эта функция вызывается самой средой выполнения при завершении интерпретатора. В целом, нет причин вызывать её явно, за исключением обработки особых сценариев, таких как форк.4142#### `int PyUnstable_CopyPerfMapFile(const char *parent_filename)`4344> *Это [нестабильное API](https://python-all.ru/3.15/c-api/stable.html#unstable-c-api). Оно может меняться без предупреждения в минорных версиях.*4546Открывает файл `/tmp/perf-$pid.map` и добавляет содержимое *parent\_filename* в него.4748Эта функция доступна на всех платформах, но генерирует вывод только на платформах, поддерживающих perf maps (в настоящее время только Linux). На других платформах она ничего не делает.4950Добавлено в версии 3.13.5152#### `int PyUnstable_PerfTrampoline_CompileCode(PyCodeObject *code)`5354> *Это [нестабильное API](https://python-all.ru/3.15/c-api/stable.html#unstable-c-api). Оно может меняться без предупреждения в минорных версиях.*5556Компилирует данный объект кода с использованием текущего perf trampoline.5758«Текущий» trampoline – это тот, который установлен средой выполнения или самым последним вызовом [`PyUnstable_PerfTrampoline_SetPersistAfterFork()`](https://python-all.ru/3.15/c-api/perfmaps.html#c.PyUnstable_PerfTrampoline_SetPersistAfterFork).5960Если trampoline не установлен, выполняется обычная компиляция (без записи perf map).6162**Параметры:**6364- **code** – Объект кода для компиляции.6566**Возвращает:**67680 при успехе, -1 при ошибке.6970Добавлено в версии 3.13.7172#### `int PyUnstable_PerfTrampoline_SetPersistAfterFork(int enable)`7374> *Это [нестабильное API](https://python-all.ru/3.15/c-api/stable.html#unstable-c-api). Оно может меняться без предупреждения в минорных версиях.*7576Устанавливает, должен ли perf trampoline сохраняться после форка.7778- Если `enable` истинно (не ноль): файл perf map остаётся открытым/действительным после форка. Дочерний процесс наследует все существующие записи perf map.79- Если `enable` ложно (ноль): файл perf map закрывается после форка. Дочерний процесс получает пустую карту perf map.8081По умолчанию: false (очищается при форке).8283**Параметры:**8485- **enable** – 1 для включения, 0 для отключения.8687**Возвращает:**88890 при успехе, -1 при ошибке.9091Добавлено в версии 3.13.92