Почему ввод кода уровня модуля в функцию, а затем вызов функции происходит быстрее в Python?

В ответ Alex Martelli на создание Python script объектно-ориентированный он упоминает, что включение кода уровня модуля в функцию, а затем вызов функции выполняется быстрее в Python. Может кто-нибудь объяснить, почему и верно ли это для всех реализаций Python?

Ответ 1

В основном это связано с переменным поиском. Для поиска переменной в глобальной области требуется поиск в словаре. Напротив, компилятор ставит статические локальные имена и ссылается на них по индексу, поэтому поиск словаря не требуется.

Обратите внимание, что в Python 2.x присутствие оператора exec внутри функции отключит эту оптимизацию, так как имена не могут быть определены статически. В Python 3.x, exec() является регулярной функцией и, как таковая, не допускается изменять переменные в локальной области.