Что такое pycache в Python и зачем он нужен
При запуске Python-скрипта многие разработчики замечают появление загадочной папки __pycache__ в директории проекта. Особенно это озадачивает начинающих программистов, которые не понимают, откуда взялся этот каталог и можно ли его удалить. Давайте разберемся, что скрывается за этим техническим артефактом.

Папка __pycache__ создается интерпретатором Питон автоматически и содержит скомпилированные байт-коды ваших .py файлов с расширением .pyc. Когда мы запускаем Python-программу, исходный код проходит этап компиляции в промежуточное представление — байткод, который затем исполняется виртуальной машиной. Чтобы не повторять этот процесс при каждом запуске, Питон сохраняет результат компиляции в кеш.

Этот скриншот моментально объясняет, откуда появляется папка pycache и что в ней лежит. Показывает связь между .py файлами и появляющимися .pyc файлами.
Основные преимущества этого механизма:
- Ускорение импорта модулей — при повторном запуске программы Python использует готовый байткод вместо повторной компиляции.
- Оптимизация загрузки — особенно заметна в проектах с множеством модулей и зависимостей.
- Прозрачность работы — кеш создается и обновляется автоматически, не требуя вмешательства разработчика.
- Можно ли удалять pycache
- Как работает система кэширования в Python
- Когда Python создаёт папку pycache
- Что хранится внутри .pyc-файлов
- Как запретить создание pycache и .pyc
- Как хранить кеш в отдельной папке
- Как Питон проверяет актуальность байткода
- Нужно ли включать pycache в Git-репозиторий
- Когда не стоит отключать кэш
- Заключение
- Рекомендуем посмотреть курсы по Python
Можно ли удалять pycache
Вопрос безопасности удаления __pycache__ волнует многих разработчиков, особенно когда эти папки начинают множиться по всей структуре проекта. Хорошая новость: удаление кеша полностью безопасно и не повлияет на работоспособность вашего кода.
При удалении __pycache__ вы просто лишаете Python возможности использовать готовый байткод при следующем импорте модулей. Интерпретатор обнаружит отсутствие .pyc файлов и автоматически скомпилирует исходники заново, создав свежий кеш. Единственное заметное последствие — незначительное увеличение времени первого запуска программы после удаления, особенно в проектах с большим количеством модулей.
Важные предостережения:
- Команда find с -exec rm -rf рекурсивно удаляет директории — убедитесь, что выполняете её в правильной папке проекта.
- В Windows будьте осторожны с командами /s /q, они удаляют без подтверждения.
- Не удаляйте __pycache__ в системных директориях Python (site-packages) без веской причины.
- При работе в виртуальных окружениях очистка кеша безопасна, но потребует пересоздания при следующей активации.
Команды для удаления кеша:
# Linux / macOS
find . -type d -name "__pycache__" -exec rm -rf {} +
# Альтернатива с проверкой
find . -name "*.pyc" -delete
find . -type d -name "__pycache__" -delete
# Windows (PowerShell)
Get-ChildItem -Path . -Filter "__pycache__" -Recurse | Remove-Item -Recurse -Force
# Альтернатива через cmd
for /d /r . %d in (__pycache__) do @if exist "%d" rd /s /q "%d"
# Python-скрипт (кроссплатформенно)
python -Bc "import pathlib; [p.rmdir() for p in pathlib.Path('.').rglob('__pycache__')]"
Удаление кеша часто полезно при отладке, когда вы подозреваете, что Питон использует устаревшую версию модуля, или при переключении между разными версиями интерпретатора в одном проекте.
Как работает система кэширования в Python
Чтобы понять механику __pycache__, нам необходимо заглянуть в процесс исполнения Питон-кода. В отличие от компилируемых языков, Python является интерпретируемым, однако это не означает, что интерпретатор работает непосредственно с исходным кодом. CPython — стандартная реализация Питон — использует промежуточный этап компиляции в байткод.
При первом запуске модуля интерпретатор транслирует .py файл в набор инструкций байткода, понятных виртуальной машине Python. Этот байткод сохраняется в файлах с расширением .pyc внутри папки __pycache__, которая создается в той же директории, где находится исходный модуль. При последующих импортах Python проверяет актуальность кешированного байткода и, если исходный файл не изменялся, использует готовую версию, минуя стадию компиляции.

Эта иллюстрация показывает, как Python создаёт кеш только для импортируемых модулей. При запуске main.py сам файл не компилируется в .pyc, но все подключённые модули получают свои записи в pycache. Визуализация помогает быстро понять ключевую механику создания кеша.
Имена .pyc файлов содержат важную информацию о среде выполнения:
- module.cpython-312.pyc — стандартный байткод для Python 3.12.
- module.cpython-312.opt-1.pyc — оптимизированная версия первого уровня (без assert и docstrings).
- module.cpython-312.opt-2.pyc — максимальная оптимизация (без assert, docstrings и дополнительной отладочной информации).
Префикс cpython указывает на используемую реализацию интерпретатора, а числовой суффикс соответствует версии Python. Это позволяет хранить байткод для разных версий интерпретатора одновременно, что особенно удобно при работе в окружениях с несколькими установленными версиями Питон.

Диаграмма условно показывает, как растёт объём «удалённых» элементов (assert, docstrings и отладочная информация) при переходе от обычного .pyc к opt-1 и opt-2. Это не точные числа, а визуальная метафора, которая помогает интуитивно понять различия между режимами. График подчёркивает, что opt-2 — самый агрессивный вариант оптимизации.
Когда Python создаёт папку pycache
Механизм создания __pycache__ срабатывает не всегда — существуют определённые условия, при которых интерпретатор принимает решение о кешировании байткода. Понимание этих условий помогает избежать путаницы и правильно организовать структуру проекта.
Ключевое различие заключается между прямым запуском файла и его импортом. Когда мы выполняем скрипт командой python script.py, Python не создаёт .pyc файл для этого конкретного скрипта — он считается точкой входа и компилируется «на лету». Однако все модули, которые импортируются внутри script.py, будут закешированы в соответствующих папках __pycache__.
Рассмотрим практические примеры:
# main.py (запускается напрямую) import helpers # helpers.py будет закеширован from utils import formatter # utils.py будет закеширован # Код выполняется...
| Ситуация | __pycache__ создаётся |
|---|---|
| Запуск python main.py | Нет (для main.py) |
| Импорт модуля import helpers | Да (для helpers.py) |
| Импорт из пакета from package import module | Да (для package и module) |
| Встроенные библиотеки (import sys) | Нет (уже предкомпилированы) |
| Сторонние пакеты в site-packages | Да (при первом импорте) |
Важная особенность: встроенные модули стандартной библиотеки уже поставляются в скомпилированном виде и не требуют создания дополнительного кеша в вашем проекте. Сторонние библиотеки, установленные через pip, создают свой собственный __pycache__ в директории site-packages при первом использовании.
Что хранится внутри .pyc-файлов
Файлы с расширением .pyc представляют собой не просто скомпилированный байткод — это структурированные контейнеры с метаданными, позволяющими Питон принимать решения о валидности кеша. Понимание внутреннего устройства этих файлов помогает осознать, почему иногда возникают проблемы с устаревшим кешем.
Каждый .pyc файл начинается с заголовка, содержащего служебную информацию, за которым следует сериализованный байткод. Структура файла включает несколько критически важных компонентов, обеспечивающих корректную работу системы кеширования.
Основные элементы .pyc файла:
- Магическое число (4 байта) — идентификатор версии Python, использованной для компиляции. Если магическое число не совпадает с текущей версией интерпретатора, файл игнорируется и создаётся заново.
- Битовое поле (4 байта) — флаги, указывающие на особенности компиляции (начиная с Python 3.7).
- Временная метка или хэш (4 или 8 байт) — механизм проверки актуальности кеша. Существует два режима:
- Timestamp-based — сохраняется время модификации исходного файла
- Hash-based — используется хэш содержимого .py файла (более надёжный метод)
- Размер исходного файла (4 байта) — дополнительная проверка для timestamp-режима.
- Сериализованный байткод — собственно скомпилированные инструкции.
Важно понимать, что байткод специфичен не только для конкретной версии Python (3.11, 3.12 и т.д.), но иногда и для минорных обновлений. Именно поэтому .pyc файлы нельзя переносить между разными установками Python — магическое число не совпадёт, и интерпретатор просто проигнорирует кеш.
Как запретить создание pycache и .pyc
В некоторых сценариях разработки создание кеша может быть нежелательным — например, при работе с Docker-контейнерами, в образовательных целях или при отладке импортов. Python предоставляет несколько способов полного отключения механизма кеширования байткода.
Первый и наиболее простой метод — использование флага -B при запуске интерпретатора. Этот флаг инструктирует Python не создавать .pyc файлы при импорте модулей:
python -B main.py # или для модулей python -B -m mypackage.module
Альтернативный подход — установка переменной окружения PYTHONDONTWRITEBYTECODE. Этот метод удобен, когда нужно отключить кеширование глобально для всех запусков Python в текущей сессии или контейнере:
# Linux / macOS export PYTHONDONTWRITEBYTECODE=1 python main.py # Windows (cmd) set PYTHONDONTWRITEBYTECODE=1 python main.py # Windows (PowerShell) $env:PYTHONDONTWRITEBYTECODE=1 python main.py # Постоянная установка в Dockerfile ENV PYTHONDONTWRITEBYTECODE=1
| Способ | Где задаётся | Комментарий |
|---|---|---|
| Флаг -B | Командная строка | Применяется к конкретному запуску, удобно для разовых задач |
| PYTHONDONTWRITEBYTECODE | Переменная окружения | Глобально влияет на все запуски Python в сессии |
| В коде (sys.dont_write_bytecode) | Python-скрипт | Программное управление, но срабатывает после запуска интерпретатора |
Важно понимать компромиссы: отключение кеша замедляет импорт модулей при каждом запуске программы. В крупных проектах с десятками зависимостей это может добавить заметную задержку. Мы рекомендуем отключать кеш только в специфических сценариях — при разработке Docker-образов (чтобы не раздувать размер слоёв), при активной отладке поведения импортов или в CI/CD пайплайнах, где чистота окружения важнее производительности.
Как хранить кеш в отдельной папке
Помимо полного отключения кеширования, Питон предоставляет возможность централизованного хранения всех .pyc файлов в одной директории, не засоряя структуру проекта множеством __pycache__ папок. Этот подход особенно полезен в контейнеризированных средах и при автоматизированных сборках.
Начиная с Python 3.8, можно использовать флаг -X pycache_prefix или соответствующую переменную окружения PYTHONPYCACHEPREFIX, указывающую путь к централизованному хранилищу байткода:
# Командная строка python -X pycache_prefix=/tmp/pycache main.py # Переменная окружения (Linux/macOS) export PYTHONPYCACHEPREFIX=/tmp/pycache python main.py # Docker ENV PYTHONPYCACHEPREFIX=/app/.cache/python
При таком подходе Python воссоздаёт структуру каталогов проекта внутри указанной директории, сохраняя там все .pyc файлы. Например, если ваш модуль находится в /project/src/utils/helpers.py, байткод будет сохранён в /tmp/pycache/project/src/utils/__pycache__/helpers.cpython-312.pyc.
Зачем выносить кеш в отдельное место:
- Docker-оптимизация — кеш можно разместить на отдельном volume, не включая его в образ.
- CI/CD пайплайны — централизованный кеш проще очищать между запусками тестов.
- Чистота репозитория — исходный код остаётся свободным от служебных папок.
- Shared hosting — некоторые хостинг-провайдеры ограничивают запись в директории с кодом.
Совет: в production-окружениях с read-only файловыми системами вынос кеша в /tmp или специальный writable volume решает проблему невозможности записи .pyc файлов, при этом сохраняя преимущества кеширования для производительности.
Как Питон проверяет актуальность байткода
Система кеширования была бы бесполезной, если бы Python не умел определять, когда сохранённый байткод устарел и требует обновления. Механизм инвалидации кеша работает автоматически, но понимание его принципов помогает избежать типичных проблем при разработке.
При импорте модуля интерпретатор сначала проверяет наличие соответствующего .pyc файла в __pycache__. Если он найден, Питон выполняет серию проверок для определения его актуальности. В timestamp-режиме (используемом по умолчанию) сравнивается время модификации исходного .py файла с меткой времени, записанной в заголовке .pyc. Дополнительно проверяется размер исходного файла — это защищает от редких случаев, когда файл изменился, но временная метка осталась прежней из-за системных особенностей.
В hash-режиме (активируется специальными инструментами сборки) Python вычисляет хэш содержимого исходника и сравнивает его с сохранённым значением. Этот подход более надёжен, поскольку не зависит от файловой системы и временных меток, что критично для распределённых систем сборки и Docker-контейнеров.
Когда происходит пересоздание .pyc файлов:
- Исходный .py файл был изменён (время модификации или хэш не совпадают).
- Размер исходного файла изменился.
- Версия Python обновилась (магическое число не соответствует).
- .pyc файл повреждён или имеет некорректную структуру.
- Используется другой уровень оптимизации (-O или -OO флаги).
Возможная проблема возникает, когда разработчик вручную откатывает изменения в файле, восстанавливая старое содержимое, но временная метка при этом обновляется. Питон пересоздаст байткод, хотя логически код вернулся к предыдущему состоянию. В редких случаях это может привести к неожиданному поведению, если разработчик ожидал использования старого кеша.
Нужно ли включать pycache в Git-репозиторий
Вопрос управления версиями байткода возникает практически в каждом Python-проекте, и здесь профессиональное сообщество выработало однозначную рекомендацию: __pycache__ не должен попадать в систему контроля версий.
Байткод является производным артефактом, специфичным для конкретной версии Python и платформы выполнения. Когда программисты работают в разных окружениях — кто-то на Python 3.11, кто-то на 3.12, кто-то использует Windows, а кто-то Linux — включение .pyc файлов в репозиторий создаёт конфликты и потенциальные проблемы совместимости. Более того, эти файлы постоянно пересоздаются, генерируя бессмысленный шум в истории коммитов.
Стандартная практика — добавление __pycache__ в файл .gitignore, который размещается в корне репозитория:
# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ *.egg-info/ .installed.cfg *.egg
Шаблон *.py[cod] покрывает файлы .pyc, .pyo (оптимизированный байткод) и .pyd (Python DLL в Windows). Запись *$py.class относится к Jython — альтернативной реализации Python для JVM.
Риски включения байткода в репозиторий:
- Несовместимость между версиями Python у разных членов команды.
- Увеличение размера репозитория без практической пользы.
- Ложные конфликты при слиянии веток.
- Потенциальные проблемы при развёртывании на production с другой версией интерпретатора.
Если вы клонировали проект и обнаружили в нём закоммиченные __pycache__ папки, рекомендуется удалить их из истории Git и добавить соответствующие правила в .gitignore. Большинство популярных шаблонов .gitignore (например, от GitHub) уже включают необходимые исключения для Python-проектов.
Когда не стоит отключать кэш
При всех описанных способах отключения __pycache__ важно понимать, что система кеширования существует не случайно — она решает реальные проблемы производительности. Существуют сценарии, где отключение байткода приводит к заметному ухудшению пользовательского опыта.
В крупных проектах с разветвлённой структурой модулей и множеством зависимостей компиляция исходного кода при каждом запуске создаёт ощутимую задержку. Если ваше приложение импортирует десятки библиотек — Django, NumPy, pandas, requests и другие тяжеловесные пакеты — отсутствие кеша может увеличить время холодного старта на несколько секунд. Для CLI-утилит, которые запускаются часто и должны отвечать мгновенно, это критично.
Лучше не отключать кеш, если:
- Вы разрабатываете production-приложение с высокими требованиями к скорости запуска.
- Проект содержит более 50 модулей или использует тяжёлые научные библиотеки (TensorFlow, PyTorch).
- Приложение запускается в среде с ограниченными вычислительными ресурсами.
- Вы работаете с микросервисной архитектурой, где каждая миллисекунда на старте имеет значение.
- Используется автоматическая перезагрузка при разработке (hot reload) — кеш значительно ускоряет этот процесс.
- В команде все используют одинаковую версию Python и виртуальные окружения.
Разумный баланс — оставить кеширование включённым в разработке и production, но добавить __pycache__/ в .gitignore и, возможно, в .dockerignore. Это сочетает преимущества производительности с чистотой репозитория и контейнеров. Отключение имеет смысл только в специфических ситуациях: при отладке проблем с импортами, в образовательных примерах или когда вы точно знаете, что оптимизация не требуется.

Майнд-карта показывает ключевые ситуации, в которых отключение кеширования в Python приводит к ухудшению производительности: высокие требования к скорости запуска, большое число модулей, ограниченные ресурсы и использование автоматической перезагрузки. Такая визуализация помогает быстро запомнить, в каких сценариях кеш обязательно должен оставаться включённым. Она усиливает вывод раздела и делает рекомендации более наглядными.
Заключение
Механизм __pycache__ представляет собой элегантное решение для оптимизации работы Питон-приложений, которое в большинстве случаев работает прозрачно и не требует вмешательства разработчика. Понимание принципов его функционирования помогает принимать обоснованные решения об управлении байткодом в различных сценариях разработки. Давайте подведем итоги:
- Pycache — это механизм кеширования байткода в Python. Он ускоряет импорт модулей и снижает нагрузку на интерпретатор.
- .pyc-файлы формируются автоматически. Python сверяет их актуальность через метаданные и пересобирает при изменениях в коде.
- Удаление кеша безопасно. При следующем запуске интерпретатор создаст новые файлы без влияния на работу проекта.
- Отключать pycache стоит не всегда. В крупных проектах отсутствие байткода замедляет работу и увеличивает время запуска.
- Гибкие настройки позволяют управлять созданием и размещением кеша. Это полезно в Docker, CI/CD и при структурировании больших репозиториев.
Рекомендуем обратить внимание на подборку курсов по Python — особенно если вы только начинаете осваивать профессию разработчика. В программах есть теоретическая база и практические упражнения, которые помогут глубже понять работу интерпретатора и файлов байткода. Такой формат обучения ускоряет погружение и делает навыки увереннее.
Рекомендуем посмотреть курсы по Python
| Курс | Школа | Цена | Рассрочка | Длительность | Дата начала | Ссылка на курс |
|---|---|---|---|---|---|---|
|
Профессия Python-разработчик
|
Eduson Academy
76 отзывов
|
Цена
Ещё -5% по промокоду
107 760 ₽
|
От
8 980 ₽/мес
|
Длительность
6 месяцев
|
Старт
7 декабря
|
Ссылка на курс |
|
Курс Go-разработчик (Junior)
|
Level UP
36 отзывов
|
Цена
45 500 ₽
|
От
11 375 ₽/мес
|
Длительность
3 месяца
|
Старт
27 января
|
Ссылка на курс |
|
Fullstack-разработчик на Python
|
Нетология
44 отзыва
|
Цена
с промокодом kursy-online
146 500 ₽
308 367 ₽
|
От
4 282 ₽/мес
|
Длительность
18 месяцев
|
Старт
18 декабря
|
Ссылка на курс |
|
Python-разработчик
|
Академия Синергия
32 отзыва
|
Цена
91 560 ₽
228 900 ₽
|
От
3 179 ₽/мес
4 552 ₽/мес
|
Длительность
6 месяцев
|
Старт
9 декабря
|
Ссылка на курс |
|
Профессия Python-разработчик
|
Skillbox
191 отзыв
|
Цена
Ещё -20% по промокоду
70 960 ₽
141 919 ₽
|
От
5 913 ₽/мес
9 715 ₽/мес
|
Длительность
11.1 месяцев
|
Старт
5 декабря
|
Ссылка на курс |
Как уволиться без проблем: правила, ошибки и лайфхаки
Увольнение — это не только новый этап в карьере, но и юридическая процедура. Разбираем, как сообщить работодателю о своем уходе и оформить заявление без подводных камней.
Что такое переменные в Python и как они работают
Переменные в Python кажутся простыми — но за этой простотой скрываются важные нюансы: изменяемость, область видимости, динамическая типизация. Разбираем их с примерами и советами.
Объектное хранилище S3: что это, как работает и как использовать
S3 хранилище это не просто сервис для файлов — это целая экосистема для бизнеса и разработчиков. В статье разберем архитектуру, преимущества и реальные сценарии использования.
Кибербезопасность в 2025 году: как не стать жертвой взлома
В современном мире каждое наше действие в интернете может стать мишенью для хакеров. Какие правила помогут сохранить ваши личные и финансовые данные в безопасности? Разбираем ключевые принципы киберзащиты.