





Если вы используете CPython, то по умолчанию нет, он не компилируется каждый раз при получении запроса, если только вы не настроите его для этого вручную.
По первому запросу uWSGI загрузит скрипты Python bytecode и перезагрузит их в двух известных мне сценариях:
service uwsgi restartТем не менее, все еще есть способ перезагружать скрипты Python в каждом запросе, подавляя его интерпретатором, например: python -B my_amazing_view.py
Для получения более подробной информации проверьте здесь:
.pycБольшое спасибо, сэр, ваши ссылки очень помогли.
Python кэширует байт-код модулей — прямо в том же месте для python2.x, в подпапке __pycache__ для python3 — но скрипты (разница в использовании — если вы импортируете его, это модуль, если вы выполняете его, это скрипт) всегда перекомпилируются (именно поэтому основные скрипты обычно очень короткие и простые).
IOW, ваш основной скрипт wsgi будет перекомпилирован один раз для каждого нового серверного процесса. Обычно приложение wsgi обслуживается как длительный процесс, который будет обрабатывать гораздо более одного запроса, поэтому даже в этом случае начальные накладные расходы на компиляцию действительно не являются проблемой (короткий скрипт + компилируется только один раз для каждого процесса)...
Кроме того, после запуска процесса Python импортированные модули кэшируются в памяти, поэтому они действительно импортируются (загружаются) только один раз для каждого процесса.
Просто обратите внимание, что пользователь, под которым запущен процесс, должен иметь права на запись в каталог вашего приложения, чтобы создавать файлы .pyc... и, конечно же, права на чтение файлов .pyc.
Я не ставлю под сомнение достоверность вашего ответа, но не могли бы вы указать на официальную документацию, где описывается эта разница в поведении скриптов? Я ничего не нашел об этом ни в ПЭП-3147, ни в Импорт. Инвалидация кэшированного байт-кода
@AlexYu это хотя бы упоминается здесь: docs.python.org/2/tutorial/modules.html#compiled-python-files и, немного по-другому, здесь: docs.python.org/3/tutorial/modules.html#compiled-python-files
Спасибо! Я нашел в первой ссылке для python-2: "Когда скрипт запускается путем указания его имени в командной строке, байт-код для скрипта никогда не записывается в файл .pyc или .pyo"". Странно, что это предложение удалено из документации python-3.
@AlexYu он был заменен на «он всегда перекомпилирует и не сохраняет результат для модуля, загружаемого непосредственно из командной строки», возможно, также для учета параметра python -m modulename CLI.
Большое спасибо @bruno & Alex. Теперь я знаю, почему мой основной скрипт должен быть маленьким и что я должен импортировать модули, чтобы избежать повторной компиляции.
Это на самом деле немного сложнее. Среда выполнения Python только компилирует (или, точнее, только кэширует скомпилированный код) модули, а не скрипты (на самом деле разница заключается в том, импортируете ли вы файл или выполняете его).