Выбор ответа Senior Память и производительность обновлено

Почему локальные переменные быстрее глобальных

Вопрос

Почему в горячем цикле обращение к локальной переменной быстрее, чем к глобальной?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Локальные берутся по индексу кадра, глобальные из словаря. Компилятор знает все локальные имена функции и обращается к ним по индексу (LOADFAST).

Варианты ответа

  1. Глобальные переменные хранятся на диске и подгружаются
  2. Локальные берутся по индексу кадра, глобальные из словаряправильный ответ
  3. Локальные переменные кешируются в регистрах процессора навсегда
  4. Разницы нет, обе берутся из одного словаря

Разбор

Компилятор знает все локальные имена функции и обращается к ним по индексу (LOAD_FAST). Глобальное имя требует поиска в словаре модуля, а если не нашли, ещё и в builtins. Современный CPython кеширует такие поиски, и разница уменьшилась, но в горячих циклах приём «сохранить функцию в локальную переменную» иногда ещё встречается. Диска и регистров «навсегда» тут нет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.