2008-11-17 5 views
34

Si un submódulo de su código carga un módulo grande, ¿hay algún beneficio al hacer referencia al módulo desde ese espacio de nombres en lugar de importarlo de nuevo?¿Pitón optimiza los módulos cuando se importan varias veces?

Tengo un módulo MyLib, que hace un uso extenso de ReallyBigLib. Si tengo código que importa MYLIB, debería excavar el módulo al igual que

import MyLib 
ReallyBigLib = MyLib.SomeModule.ReallyBigLib 

o simplemente

import MyLib 
import ReallyBigLib 

Respuesta

46

módulos de Python podrían considerarse como simple ... no importa cuántas veces que se importan son inicializadas solo una vez, así que es mejor que hacer:

import MyLib 
import ReallyBigLib 

documentación pertinente en la declaración de importación:

https://docs.python.org/2/reference/simple_stmts.html#the-import-statement

Una vez se conoce el nombre del módulo (a menos que se especifique lo contrario, el término “módulo” se referirán a los dos paquetes y módulos), en busca de t El módulo o paquete puede comenzar. El primer lugar marcado es sys.modules, el caché de todos los módulos que se han importado previamente. Si el módulo se encuentra allí, entonces se usa en el paso (2) de importación.

Los módulos importados se almacenan en caché en sys.modules:

Este es un diccionario que mapea nombres de los módulos a módulos que ya han sido cargados. Esto puede ser manipulado para forzar la recarga de módulos y otros trucos. Tenga en cuenta que eliminar un módulo de este diccionario no es lo mismo que llamar a reload() en el objeto de módulo correspondiente.

+0

Gracias, Podría jurar que lo leí en alguna parte, pero no pude encontrarlo para confirmar – JimB

+2

Sin embargo, si desea volver a importar el módulo, puede utilizar la función reload(). Esto podría ser si el módulo ha sido cambiado, por ejemplo. –

+0

Te creo, pero ... ¿puedes señalar los documentos? – dfrankow

0

Es performancewise los mismos. Todavía no hay un compilador JIT en Python.

+0

Hoy en día tenemos [PyPy] (http://pypy.org/), que incluye un JIT basado en llvm. – BobC

7

No hace una diferencia sustancial. Si el módulo grande ya se ha cargado, la segunda importación en su segundo ejemplo no hace más que agregar 'ReallyBigLib' al espacio de nombre actual.

20

Como han señalado otros, Python mantiene una lista interna de todos los módulos que se han importado. Cuando importa un módulo por primera vez, el módulo (una secuencia de comandos) se ejecuta en su propio espacio de nombres hasta el final, la lista interna se actualiza y la ejecución continúa después de la instrucción de importación.

probar este código:

# module/file a.py 
    print "Hello from a.py!" 
    import b 

    # module/file b.py 
    print "Hello from b.py!" 
    import a 

No hay bucle: sólo hay una búsqueda en la caché.

>>> import b 
Hello from b.py! 
Hello from a.py! 
>>> import a 
>>> 

Una de las bellezas de Python es cómo todo se desarrolla al ejecutar un script en un espacio de nombres.

+0

Bien probado :) – m93a

3

El registro interno de módulos importados es el diccionario sys.modules, que asigna nombres de módulo a objetos de módulo. Puede mirar allí para ver todos los módulos que se importan actualmente.

También puede obtener algunos trucos útiles (si es necesario) maquetando con sys.modules - por ejemplo, agregando sus propios objetos como pseudo-módulos que pueden ser importados por otros módulos.

Cuestiones relacionadas