Что значит интерпретируемый или компилируемый язык
Что проверяют
Понимаете ли, что «Python интерпретируемый» это упрощение, и знаете ли, что реально происходит при запуске скрипта. Заодно проверяют, откуда берутся файлы в __pycache__ и почему расширения на C работают быстрее чистого Python.
Как отвечать
Начните с разделения языка и реализации: компилируемость это свойство реализации, а не языка. CPython работает в два шага: сначала исходник компилируется в байткод, затем байткод выполняет виртуальная машина. Байткод кэшируется на диске и при неизменном файле переиспользуется, поэтому повторный импорт стартует быстрее.
Посмотреть на это можно прямо на собеседовании: dis.dis(func) печатает инструкции виртуальной машины.
Дальше стоит назвать шкалу реализаций:
- CPython: компиляция в байткод плюс интерпретация;
- PyPy: компиляция горячих участков в машинный код во время работы;
- Cython и расширения на C или Rust: настоящая компиляция в нативный код, отсюда скорость numpy;
- Numba: то же самое, но точечно для отдельных функций.
Про плюсы и минусы говорите по делу. Интерпретация даёт быстрый цикл правки, интроспекцию и один исходник под разные платформы; платите скоростью и тем, что ошибка видна только когда до строки дошло выполнение. Часть этого добирается линтерами и аннотациями типов с внешней проверкой, но это инструменты, а не компилятор языка.
Где спотыкаются
Повторяют, что Python выполняет код построчно. Модуль компилируется целиком: опечатка в последней строке не даст выполниться первой.
Второе: увидев файлы с байткодом, делают вывод, что Python компилируемый наравне с C. Байткод не машинный код, ему всё равно нужна виртуальная машина, и от процессора он не зависит.
Третье: путают компиляцию с упаковкой. Сборка проекта в один исполняемый файл кладёт внутрь интерпретатор и байткод, скорости это не прибавляет.