valor propiedades lista funciones diccionarios diccionario dentro declarar buscar python performance closures nested-function

lista - propiedades diccionarios python



Función dentro de la función-¿cada vez? (2)

Déjanos tener este código:

def big_function(): def little_function(): ....... .........

La documentación de Python dice acerca de la declaración de def :

Una definición de función es una sentencia ejecutable. Su ejecución enlaza el nombre de la función ...

Entonces, la pregunta es: ¿se def little_function() cada vez que se invoca big_function ? La pregunta es sobre la declaración de def exactamente, no el cuerpo little_function()


El código en la función interna se compila una sola vez, por lo que no debería haber una penalización de tiempo de ejecución significativa.

Solo el cierre de la función interna se actualiza cada vez que se llama la función externa. Vea here , por ejemplo, para más detalles sobre cierres.

Aquí hay una demostración rápida, examinando el cierre:

def f(x): a = [] b = x + 1 def g(): print a, b return g In [28]: y = f(5) In [29]: y Out[29]: <function __main__.g> In [30]: y.func_closure Out[30]: (<cell at 0x101c95948: list object at 0x101c3a3f8>, <cell at 0x101c958a0: int object at 0x100311aa0>) In [31]: y.func_closure[1].cell_contents Out[31]: 6


Puedes verificar el bytecode con el módulo dis :

>>> import dis >>> def my_function(): ... def little_function(): ... print "Hello, World!" ... ... >>> dis.dis(my_function) 2 0 LOAD_CONST 1 (<code object little_function at 0xb74ef9f8, file "<stdin>", line 2>) 3 MAKE_FUNCTION 0 6 STORE_FAST 0 (little_function) 9 LOAD_CONST 0 (None) 12 RETURN_VALUE

Como se puede ver, el código para la función interna se compila una sola vez . Cada vez que llama a my_function , se carga y se crea un nuevo objeto de función (en este sentido, la def little_function se ejecuta cada vez que se llama my_function ), pero esto no agrega demasiada sobrecarga.