Выбор ответа Senior Память и производительность обновлено
Почему локальные переменные быстрее глобальных
Вопрос
Почему в горячем цикле обращение к локальной переменной быстрее, чем к глобальной?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Локальные берутся по индексу кадра, глобальные из словаря. Компилятор знает все локальные имена функции и обращается к ним по индексу (LOADFAST).
Варианты ответа
- Глобальные переменные хранятся на диске и подгружаются
- Локальные берутся по индексу кадра, глобальные из словаряправильный ответ
- Локальные переменные кешируются в регистрах процессора навсегда
- Разницы нет, обе берутся из одного словаря
Разбор
Компилятор знает все локальные имена функции и обращается к ним по индексу (LOAD_FAST). Глобальное имя требует поиска в словаре модуля, а если не нашли, ещё и в builtins. Современный CPython кеширует такие поиски, и разница уменьшилась, но в горячих циклах приём «сохранить функцию в локальную переменную» иногда ещё встречается. Диска и регистров «навсегда» тут нет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Память и производительность»
- Встроенные функции против ручного цикла
- Пересечение больших списков id
- Числа Фибоначчи без экспоненты
- Скользящая медиана потока на двух кучах
- Найти пару с суммой быстрее O(n²)
- Циклические ссылки и gc
- Управление памятью в CPython
- Инструменты профилирования Python