👋 Канал OTUS в Telegram!
Посты от приглашенных гостей из IT-тусовки, полезные статьи, подборки вакансий от партнеров ➞
Подробнее

Курсы

Программирование
Архитектор программного обеспечения
-40%
Архитектура и шаблоны проектирования
-40%
Разработчик C++
-40%
Fullstack разработчик JavaScript
-40%
MS SQL Server разработчик
-40%
Android-разработчик. Продвинутый курс
-40%
Алгоритмы и структуры данных
-30%
Team Lead
-30%
Разработчик Python. Базовый курс
-30%
Разработчик Python. Продвинутый курс
-22%
iOS Разработчик. Продвинутый курс
-21%
CI/CD
-37%
Разработчик C#
-25%
PostgreSQL Framework Laravel Web-разработчик на Python Разработчик программных роботов (RPA) на базе UiPath и PIX Разработчик игр на Unity Vue.js разработчик Agile Project Manager в IT Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

О компиляции и (полу)компиляции в CPython

Python_Deep_10.12_site-5020-79682c.png

Всем известно, что Python — интерпретируемый язык программирования. Но это не совсем точно, конечно. Чтобы употреблять такие слова, нужно говорить о какой-то конкретной имплементации языка.Что же, давайте попробуем начать сначала.

Дубль два

Всем известно, что CPython (самая распространенная имплементация) интерпретируемый! Но это не совсем точно, конечно. Можно сказать, что CPython полукомпилируемый, потому что исходный код компилируется в байт-код, который потом исполняется виртуальной машиной (тоже CPython в данном случае).

Традиционно же, когда мы говорим о компиляции, мы имеем в виду преобразование высокоуровневого языка в конкретный машинный код. У этой (полу)компиляции в Python есть свои особенности.

Исходный код можно скомпилировать в байт-код с разными флагами оптимизации: -О, -ОО. В результате у вас появятся *.pyo файлики с байт-кодом. При этом в первом случае у вас будут «выключены» assert'ы, а во втором — ещё «вырежутся» docstring'и. Оптимизации не особо крутые, чего уж тут говорить, если только в asserta'ах не было какой-то сложной логики.

И что это значит с практической точки зрения?

Как это знание может пригодиться? Например, если код разворачивается на CentOS с помощью rpm-пакетов, то во время сборки пакета неявно запускается brp-python-bytecompile скрипт, который компилирует Python файлы в .pyc и .pyo. Поэтому не стоит потом удивляться, что assert'ы в коде не срабатывают.

Хотите задать вопрос? Пишите комментарий!

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться