Найти тему

Кэширование файлов в Python

Как известно, Python - это интерпретируемый язык, что означает, что для выполнения программы, написанной на нем, интерпретатор сначала читает текст программы на языке Python, и выполняет его, в отличие от компилируемых языков, где исходный код сначала проходит этап компиляции в двоичный код, и исполняется уже двоичный код, а не исходный код программы.

Но не все так просто в питоне, на самом деле, на практике, исполняется не сам исходный код программы, как бы это ни парадоксально звучало.

При первом запуске программы на питоне, интерпретатор читает исходные PY-файлы, компилирует их в байт-код, и сохраняет этот байт-код в папках с именем "__pycache__"
(по два подчеркивания с каждой стороны!), и в файлах в этой папке с именами, аналогичными *.py - файлам, но с расширением ".pyc". Для простоты понимания расшифровывайте это расширение как "python compilled" (компилированный).

После первого запуска программы на питоне вы можете заметить, что в дереве папок программы появились новые папки.

Созданная папка __pycache__
Созданная папка __pycache__
Файлы .pyc в папке __pycache__
Файлы .pyc в папке __pycache__

Поскольку программа может быть запущена на нескольких версиях питона, к исходному имени файла и перед расширением ".pyc" добавляется строка указывающая на то, какой версией питона этот байт-код скомпилирован. Если вы запустите одну и ту же программу на разных версиях питона, то скомпилированных файлов будет больше, т.к. байт-код у разных версий питона различается.

При новом запуске программы интерпретатор питона читает имя файла, ищет его скомпилированный вариант, сравнивает дату-время создания файлов, и, если файл ".pyc" новее файла ".py", то выполняет именно его, а не ".py" файл.

Если скомпилированной версии файла нет, или ".py" файл новее по дате, чем ".pyc", то происходит чтение ".py" файла, сохранение его ".pyc" версии, и выполнение именно ".pyc" версии.

Именно поэтому первый старт программы происходит намного медленнее, чем последующие, т.к. интерпретатору требуется время на компиляцию ".py" файлов.

Что с этими папками и файлами делать?

Я поступаю так:

  • если я знаю, что эти папки и файлы создавались при мне, то пусть будут.
  • если они "откуда то пришли" вместе с исходным кодом, то у меня последовательность действий следующая:
Найти все папки "__pycache__", вывести список найденного на панель.
Найти все папки "__pycache__", вывести список найденного на панель.
Список найденного выведен на панель
Список найденного выведен на панель
Ctrl+a, Del - Гудбай май лав, гудбай!
Ctrl+a, Del - Гудбай май лав, гудбай!

При следующем запуске программы, питон создаст новый кэш (а я подожду несколько лишних секунд).

Отключение кэширования байт-кода для разработчиков

Иногда разработчику требуется отключить подобное кэширование, особенно когда идет активная правка py-файлов и надо оперативно видеть отображаемый результат изменений в коде.

Для этих целей проще всего запустить питона с ключом "-B" перед именем py-файла, а можно присвоить любое непустое значение системной переменной с именем "PYTHONDONTWRITEBYTECODE", что равносильно применению ключа "-B".

Можно в начале py-файла включить строку:

export PYTHONDONTWRITEBYTECODE=abc

... собственно, все эти методы равнозначны.

Собственно и все, что нужно знать об этих папках и файлах. Не бойтесь их удалять, особенно при передаче или публикации исходного кода на Python. Если пользуетесь GitHub, то включайте их в ".gitignore".

Удачи!
NStor
https://t.me/stable_cascade_rus
https://t.me/srigert