сеньорчикОткрыть в Telegram
← все вопросывопросы для собеседований · Рантайм Python

Вопросы по рантайму Python на собеседовании

Вопросы про рантайм отделяют тех, кто отлаживал прод, от тех, кто читал документацию. Обычно всё начинается с подсчёта ссылок и заканчивается практикой: как вы искали утечку и чем профилировали медленный обработчик.

66 вопросов в банке·5 подтем·ниже разбор 9

Из чего состоит тема

Так тема разложена в тренажёре: движок ведёт прогресс по каждой подтеме отдельно и возвращает те, где вы ошибаетесь.

Разборы подтем

Конспект по каждой: что это, как отвечать вслух, на чём валятся, плюс вопросы для самопроверки.

Примеры вопросов с разбором

  1. #cpython_gc1 / 9
    Как CPython по умолчанию освобождает память объекта?
    A)Только периодическим сборщиком мусора, запускаемым по таймеру
    B)Подсчётом ссылок: при падении счётчика до нуля — сразу
    C)Вручную: программист сам вызывает free на ненужных объектах
    D)Не раньше завершения процесса — память отдаётся только на выходе
    показать ответ и разбор
    +B)Подсчётом ссылок: при падении счётчика до нуля — сразу

    // разбор: Основной механизм CPython — подсчёт ссылок: у каждого объекта счётчик, и как только он падает до нуля (вышли из области видимости, del, переприсваивание), объект уничтожается немедленно и детерминированно. Поверх работает отдельный сборщик циклов — на случай, когда refcount сам не справляется.

  2. #packaging_deps2 / 9
    Зачем нужно виртуальное окружение (venv)?
    A)Ускорять импорт пакетов за счёт предварительной их компиляции
    B)Изолировать зависимости проекта от системных и других проектов
    C)Запускать код в отдельном контейнере с ограничением прав доступа
    D)Хранить исходники проекта отдельно от установленных библиотек
    показать ответ и разбор
    +B)Изолировать зависимости проекта от системных и других проектов

    // разбор: venv создаёт изолированное окружение с собственным набором установленных пакетов, отвязанным от системного Python и других проектов. Так у проекта А может быть Django 4, у Б — Django 5, без конфликтов. Это базовая гигиена: ставить зависимости не глобально, а в окружение проекта.

  3. #profiling_perf3 / 9
    С чего начинают оптимизацию медленного кода?
    A)Оптимизируют все циклы подряд, чтобы наверняка что-то помогло
    B)С измерения профайлером, а не с догадок о узком месте
    C)Меняют интерпретатор на более быстрый ещё до всяких замеров
    D)Сразу переписывают самый сложный на вид участок на месте
    показать ответ и разбор
    +B)С измерения профайлером, а не с догадок о узком месте

    // разбор: Оптимизация без измерения — гадание: интуиция про «где медленно» чаще ошибается. Сперва профилируют (cProfile, py-spy), находят реальные горячие точки, и только их оптимизируют. Правило: сначала измерь, потом меняй, потом снова измерь. Иначе усложняешь код там, где это ничего не даёт.

  4. #py_memory_model4 / 9
    Что такое переменная в Python по отношению к объекту?
    A)Именованная ячейка памяти фиксированного размера под значение
    B)Копия значения, независимая от других переменных программы
    C)Имя-ссылка на объект, а не сама ячейка со значением
    D)Указатель на область стека, живущий строго до конца функции
    показать ответ и разбор
    +C)Имя-ссылка на объект, а не сама ячейка со значением

    // разбор: В Python имя — это ссылка (binding) на объект в куче, а не ячейка со значением. b = a копирует ссылку: оба имени указывают на один объект. Для неизменяемых (int, str) разница незаметна, а для изменяемых (list) — критична: правка через одно имя видна через другое.

  5. #typing_mypy5 / 9
    Проверяет ли Python аннотации типов во время выполнения?
    A)Нет: аннотации — подсказки, рантайм их не навязывает
    B)Да, при передаче неверного типа сразу бросается TypeError
    C)Да, но только для аргументов функций, не для возвращаемых значений
    D)Да, если включить специальный флаг интерпретатора при запуске
    показать ответ и разбор
    +A)Нет: аннотации — подсказки, рантайм их не навязывает

    // разбор: Аннотации типов в Python — необязательные подсказки: интерпретатор их хранит (в __annotations__), но не навязывает. Передать str туда, где объявлен int, можно — упадёт лишь позже на несовместимой операции, а то и вовсе нет. Проверку до запуска делает внешний тайпчекер (mypy, pyright), а не рантайм.

  6. #cpython_gc6 / 9
    Что подсчёт ссылок сам по себе освободить не может?
    A)Обычные локальные переменные после выхода из функции
    B)Большие списки и словари — они живут до конца процесса
    C)Строки, потому что все они интернированы и неизменяемы навсегда
    D)Объекты в циклической ссылке друг на друга
    показать ответ и разбор
    +D)Объекты в циклической ссылке друг на друга

    // разбор: Если два объекта ссылаются друг на друга (a.ref=b, b.ref=a), их счётчики ссылок не падают до нуля даже после удаления внешних имён — цикл «держит сам себя». Такой мусор refcount не соберёт; для него есть отдельный циклический сборщик (модуль gc), который находит и разрывает недостижимые циклы.

  7. #packaging_deps7 / 9
    Почему для воспроизводимой сборки версии зависимостей пинуют (фиксируют)?
    A)Пины нужны лишь для приватных пакетов, публичные и так стабильны
    B)Иначе свежая версия зависимости молча сломает сборку
    C)Без пинов pip вообще откажется устанавливать зависимости проекта
    D)Пины ускоряют установку, потому что pip не ищет свежие версии
    показать ответ и разбор
    +B)Иначе свежая версия зависимости молча сломает сборку

    // разбор: Без фиксации версий pip ставит последнее совместимое, и на разных машинах/во времени набор зависимостей расходится — сборка «у меня работала», а в CI или на проде падает из-за нового релиза транзитивной зависимости. Пины (а лучше lock-файл) фиксируют точный набор и делают сборку воспроизводимой.

  8. #profiling_perf8 / 9
    Веб-эндпоинт тормозит. Что чаще оказывается узким местом в типичном бэкенде?
    A)Размер исходного кода модуля, который парсится на каждый запрос
    B)Скорость самого интерпретатора Python на арифметике в хендлере
    C)Ожидание I/O: запросы к БД и внешним сервисам, а не Python-счёт
    D)Количество комментариев и аннотаций типов в коде эндпоинта
    показать ответ и разбор
    +C)Ожидание I/O: запросы к БД и внешним сервисам, а не Python-счёт

    // разбор: В типичном бэкенде время уходит не на Python-арифметику, а на ожидание: запросы к БД (особенно N+1), вызовы внешних API, сериализация больших ответов. Поэтому и профилируют сначала эти границы. Микрооптимизация Python-циклов при медленных запросах к БД — оптимизация не того.

  9. #py_memory_model9 / 9
    Чем is отличается от ==?
    A)== сравнивает адреса в памяти, а is — содержимое объектов
    B)Это синонимы, разница только в скорости выполнения сравнения
    C)is для чисел, == для строк — по типу сравниваемых данных
    D)is сравнивает идентичность объектов, == — их значения
    показать ответ и разбор
    +D)is сравнивает идентичность объектов, == — их значения

    // разбор: == вызывает __eq__ и сравнивает значения (два разных списка с одинаковым содержимым равны). is проверяет идентичность — это буквально один и тот же объект в памяти. Для None/True/False используют is (они синглтоны). Путаница даёт коварные баги на границе кэшируемых объектов.

это 9 из 66

Ещё 57 вопросов по теме — в тренажёре, с движком повторения

Прочитать разбор и ответить самому — разные навыки. В Сеньорчике вопросы идут сессиями, а движок возвращает подтемы, где вы ошибаетесь, пока они не начнут отскакивать. Бесплатно, лимит по энергии.

Частые вопросы