¿Cómo hace el recocido local de nombres globales en Python para hacer que el código sea más rápido / optimizado?

Estaba leyendo sobre Valores de parámetros predeterminados en Python en Effbot.

Hay una sección más adelante en el artículo donde el autor habla sobre los usos válidos para los valores predeterminados mutables y cita el siguiente ejemplo:

and, for highly optimized code, local rebinding of global names: import math def this_one_must_be_fast(x, sin=math.sin, cos=math.cos): ... 

No he podido localizar cómo esto causa una ejecución de código rápida / altamente optimizada. ¿Alguien puede ilustrar esto con una respuesta bien informada (y preferiblemente con citas)?

El acceso de CPython a la variable local está basado en el índice (que involucra el LOAD_FAST operación LOAD_FAST ).

Por otro lado, se accede a los globales a través de la búsqueda de nombres en un diccionario (utilizando el código de operación LOAD_GLOBAL ). Para las variables del módulo, es un proceso de dos pasos. Usar una primera búsqueda ( LOAD_GLOBAL ) para empujar el objeto del módulo, y luego usar una segunda búsqueda ( LOAD_ATTR ) para ubicar al miembro apropiado.

Incluso si la búsqueda del diccionario está altamente optimizada, no puede superar el acceso indirecto.

 import math def f(): math.sin(1) 4 0 LOAD_GLOBAL 0 (math) *** 3 LOAD_ATTR 1 (sin) *** 6 LOAD_CONST 1 (1) 9 CALL_FUNCTION 1 12 POP_TOP 13 LOAD_CONST 0 (None) 16 RETURN_VALUE 

 from math import sin def f(): sin(1) 4 0 LOAD_GLOBAL 0 (sin) *** 3 LOAD_CONST 1 (1) 6 CALL_FUNCTION 1 9 POP_TOP 10 LOAD_CONST 0 (None) 13 RETURN_VALUE 

 def f(sin=math.sin): sin(1) 7 0 LOAD_FAST 0 (sin) *** 3 LOAD_CONST 1 (1) 6 CALL_FUNCTION 1 9 POP_TOP 10 LOAD_CONST 0 (None) 13 RETURN_VALUE