Найти в Дзене
Герман Геншин

Одна опция Python мгновенно “разогнала” мой код — заберите этот лайфхак!

Как ускорить Python-программу? Большинство сходу бросается переписывать алгоритмы, прикручивать C-библиотеки или гоняет профилировщики неделями. А иногда для реального прироста скорости достаточно одной магической опции запуска — нужно всего лишь указать особый параметр в командной строке. Речь о флаге, который при включении заставляет интерпретатор Python ещё на этапе компиляции убрать всё лишнее — оставляя только тот код, который реально нужен для работы вашей логики. Запустите свой скрипт через python -O script.py — так вы включаете встроенный режим оптимизации Python. Многие про этот флаг не вспоминают, считая assert простой подстраховкой при отладке. Кажется, что эти проверки безвредны, «лежат» себе в коде и мешают только при ошибках. Однако в продакшене, когда ваш код крутится в цикле или обрабатывает большой поток данных, регулярное выполнение assert действительно тормозит, особенно в часто вызываемых функциях. При запуске с -O интерпретатор пересобирает байткод: все assert исч
Оглавление

Как ускорить Python-программу? Большинство сходу бросается переписывать алгоритмы, прикручивать C-библиотеки или гоняет профилировщики неделями. А иногда для реального прироста скорости достаточно одной магической опции запуска — нужно всего лишь указать особый параметр в командной строке.

Речь о флаге, который при включении заставляет интерпретатор Python ещё на этапе компиляции убрать всё лишнее — оставляя только тот код, который реально нужен для работы вашей логики.

Неизвестный большинству способ ускорить Python-программы в один клик

-2

Запустите свой скрипт через python -O script.py — так вы включаете встроенный режим оптимизации Python. Многие про этот флаг не вспоминают, считая assert простой подстраховкой при отладке.

Кажется, что эти проверки безвредны, «лежат» себе в коде и мешают только при ошибках. Однако в продакшене, когда ваш код крутится в цикле или обрабатывает большой поток данных, регулярное выполнение assert действительно тормозит, особенно в часто вызываемых функциях. При запуске с -O интерпретатор пересобирает байткод: все assert исчезают — полностью, даже следов не остаётся.

Python-компилятор вырезает assert на этапе создания итогового файла, когда программа ещё даже не стартовала. В итоге файл становится легче, а вместе с ним пропадает лишний “балласт”, который мог бы тормозить выполнение.

Но и это ещё не всё. При флаге -O глобальная константа __debug__ становится False (обычно она True), и весь вспомогательный код, который «прятался» за if __debug__:, также исчезает из байткода.

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

Как выжать из байткода Python максимум: удаляем всё лишнее

-3

Обычный флаг -O — отличный вариант. Но если хочется сделать скрипт ещё компактнее, включайте -OO. Этот режим полностью вырезает даже docstrings — строки документации из классов, функций и модулей — прямо из .pyc-файла.

С -OO Python удаляет любые docstrings: после компиляции __doc__ останется пустым. В современных версиях (PEP 488) при этом создаются отдельные файлы .opt-2.pyc — они отличаются и от классических .pyc, и от .opt-1.pyc при обычной оптимизации.

Здесь есть нюанс: ради экономии памяти и места вы жертвуете удобством — файл становится ощутимо меньше, меньше расходуется ОЗУ, ведь Python не хранит мегабайты описаний, не нужных для логики.

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

Бонус — программа стартует быстрее: меньше весит, требует меньше операций ввода-вывода при запуске и быстрее импортирует модули. Это идеально для CLI-утилит или сервисов, которым нужна моментальная скорость запуска. Такой подход — признак продуманной оптимизации.

Но не всё так безоблачно: опция -OO «ломает» всё, что использует docstrings — doctest, pydoc и любые инструменты, которые собирают документацию или тесты прямо из кода. Используйте самую жёсткую оптимизацию там, где вы уверены, что документация не понадобится во время работы.

Как ускорить старт Python-программы с помощью изоляции окружения

-4

Ещё один рабочий трюк — флаг -E. Он запрещает интерпретатору читать любые переменные среды PYTHON* при запуске. Обычно такие переменные, например, PYTHONPATH или PYTHONHOME, отвечают за поиск модулей и стандартные пути.

С одной стороны, это удобно, с другой — именно из-за них Python часто перебирает кучу лишних путей, замедляя старт скрипта, особенно если настройка системы перегружена.

Подпишитесь — и получите лучшие Python-лафйхаки первым!

С флагом -E все эти обходы отключаются, и интерпретатор не тратит время на сканирование пользовательских директорий и сторонних site-packages, не нужных вашему скрипту. Это моментальный «ресет» окружения, после которого программа стартует заметно быстрее.

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

Для максимальной изоляции есть ещё флаг -I — он не только отключает переменные окружения, но и убирает пользовательские site-директории и текущую папку из sys.path. Но в большинстве случаев достаточно просто -E, если нужно запретить влияние окружения.

В итоге Python предлагает вам мощные инструменты на любой вкус: вы сами решаете, что оставить для отладки и тестирования, а что стоит убрать в production. Всё, что помогает разбираться в коде, при серьезных нагрузках легко превращается в балласт.

Иногда достаточно поправить всего одну команду запуска Python — и вы уже выигрываете в скорости, расходе памяти и времени старта, ничего не меняя в исходниках. Часто пара правильных флагов даёт больший эффект, чем недели даже самой въедливой ручной оптимизации.

Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!

Премиум подписка - это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь

Также подписывайтесь на нас в: