Что такое файл .pyc и как он используется в Python
Что проверяют
Понимаете ли вы, что Python компилирует исходник в байт-код, и можете ли объяснить, где этот байт-код лежит и когда считается устаревшим. Попутно проверяют, нет ли у вас мифа про «скомпилированный Python» как способ спрятать исходники от заказчика.
Как отвечать
При импорте модуля интерпретатор компилирует исходник в байт-код и кладёт результат в каталог __pycache__ рядом с модулем. В имени файла записаны реализация и версия интерпретатора, поэтому кеши разных интерпретаторов не конфликтуют между собой.
При следующем импорте кеш проверяется на свежесть: в заголовке лежат время изменения и размер исходника, и если они совпали, компиляция пропускается. Есть и режим проверки по хешу исходника, он удобен для сборок, где время файлов не сохраняется.
Что стоит добавить: кешируются только импортируемые модули, запущенный напрямую скрипт своего файла кеша не оставляет; запись отключается переменной PYTHONDONTWRITEBYTECODE или флагом sys.dont_write_bytecode; прогреть кеш заранее умеет compileall, чем и пользуются при сборке образов.
Экономия тут ровно одна: пропускается разбор и компиляция на импорте. Скорость исполнения самого байт-кода от наличия кеша не меняется.
Где спотыкаются
Говорят, что кеш байт-кода ускоряет работу программы. Он ускоряет старт, и заметно это на большом дереве импортов, а не на счётной работе внутри цикла.
Считают раздачу .pyc защитой исходного кода. Байт-код разбирается модулем dis в читаемую последовательность инструкций, и логика восстанавливается почти дословно.
Ждут, что оставшийся файл кеша подхватится после удаления исходника. Файл внутри __pycache__ сам по себе не импортируется, и именно так выглядит загадочная ошибка импорта после чистки репозитория.