Как ускорить Python-программу? Большинство сходу бросается переписывать алгоритмы, прикручивать C-библиотеки или гоняет профилировщики неделями. А иногда для реального прироста скорости достаточно одной магической опции запуска — нужно всего лишь указать особый параметр в командной строке.
Речь о флаге, который при включении заставляет интерпретатор Python ещё на этапе компиляции убрать всё лишнее — оставляя только тот код, который реально нужен для работы вашей логики.
Неизвестный большинству способ ускорить Python-программы в один клик
Запустите свой скрипт через python -O script.py — так вы включаете встроенный режим оптимизации Python. Многие про этот флаг не вспоминают, считая assert простой подстраховкой при отладке.
Кажется, что эти проверки безвредны, «лежат» себе в коде и мешают только при ошибках. Однако в продакшене, когда ваш код крутится в цикле или обрабатывает большой поток данных, регулярное выполнение assert действительно тормозит, особенно в часто вызываемых функциях. При запуске с -O интерпретатор пересобирает байткод: все assert исчезают — полностью, даже следов не остаётся.
Python-компилятор вырезает assert на этапе создания итогового файла, когда программа ещё даже не стартовала. В итоге файл становится легче, а вместе с ним пропадает лишний “балласт”, который мог бы тормозить выполнение.
Но и это ещё не всё. При флаге -O глобальная константа __debug__ становится False (обычно она True), и весь вспомогательный код, который «прятался» за if __debug__:, также исчезает из байткода.
Интерпретатор заранее удаляет всё, что предназначено только для диагностики или отладки — так он не тратит ресурсы на проверки, которые всё равно не нужны в рабочем бою. Поэтому вы можете спокойно оставлять подробную диагностику в исходниках, не теряя при этом в скорости или эффективности на сервере.
Как выжать из байткода Python максимум: удаляем всё лишнее
Обычный флаг -O — отличный вариант. Но если хочется сделать скрипт ещё компактнее, включайте -OO. Этот режим полностью вырезает даже docstrings — строки документации из классов, функций и модулей — прямо из .pyc-файла.
С -OO Python удаляет любые docstrings: после компиляции __doc__ останется пустым. В современных версиях (PEP 488) при этом создаются отдельные файлы .opt-2.pyc — они отличаются и от классических .pyc, и от .opt-1.pyc при обычной оптимизации.
Здесь есть нюанс: ради экономии памяти и места вы жертвуете удобством — файл становится ощутимо меньше, меньше расходуется ОЗУ, ведь Python не хранит мегабайты описаний, не нужных для логики.
На домашнем компьютере пара мегабайт не критична, но вот в контейнерах, микросервисах, на микроустройствах или при запуске тысячи копий на слабом железе — тут каждый мегабайт на вес золота.
Бонус — программа стартует быстрее: меньше весит, требует меньше операций ввода-вывода при запуске и быстрее импортирует модули. Это идеально для CLI-утилит или сервисов, которым нужна моментальная скорость запуска. Такой подход — признак продуманной оптимизации.
Но не всё так безоблачно: опция -OO «ломает» всё, что использует docstrings — doctest, pydoc и любые инструменты, которые собирают документацию или тесты прямо из кода. Используйте самую жёсткую оптимизацию там, где вы уверены, что документация не понадобится во время работы.
Как ускорить старт Python-программы с помощью изоляции окружения
Ещё один рабочий трюк — флаг -E. Он запрещает интерпретатору читать любые переменные среды PYTHON* при запуске. Обычно такие переменные, например, PYTHONPATH или PYTHONHOME, отвечают за поиск модулей и стандартные пути.
С одной стороны, это удобно, с другой — именно из-за них Python часто перебирает кучу лишних путей, замедляя старт скрипта, особенно если настройка системы перегружена.
Подпишитесь — и получите лучшие Python-лафйхаки первым!
С флагом -E все эти обходы отключаются, и интерпретатор не тратит время на сканирование пользовательских директорий и сторонних site-packages, не нужных вашему скрипту. Это моментальный «ресет» окружения, после которого программа стартует заметно быстрее.
Особенно это чувствуется, если PYTHONPATH заполнен десятками папок или сетевыми дисками — поиск модулей затягивается, а порой и стандартные библиотеки могут конфликтовать из-за неправильных версий.
Для максимальной изоляции есть ещё флаг -I — он не только отключает переменные окружения, но и убирает пользовательские site-директории и текущую папку из sys.path. Но в большинстве случаев достаточно просто -E, если нужно запретить влияние окружения.
В итоге Python предлагает вам мощные инструменты на любой вкус: вы сами решаете, что оставить для отладки и тестирования, а что стоит убрать в production. Всё, что помогает разбираться в коде, при серьезных нагрузках легко превращается в балласт.
Иногда достаточно поправить всего одну команду запуска Python — и вы уже выигрываете в скорости, расходе памяти и времени старта, ничего не меняя в исходниках. Часто пара правильных флагов даёт больший эффект, чем недели даже самой въедливой ручной оптимизации.
Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!
Премиум подписка - это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь
Также подписывайтесь на нас в:
- Telegram: https://t.me/gergenshin
- Youtube: https://www.youtube.com/@gergenshin
- Яндекс Дзен: https://dzen.ru/gergen
- Официальный сайт: https://www-genshin.ru