2012-05-20 16 views
8

¿Importa dónde se cargan los módulos en un código? ¿O deberían declararse todos en la parte superior, ya que durante el tiempo de carga los módulos externos deberán cargarse independientemente de dónde estén declarados en el código ...?Python: optimización de las importaciones

Ejemplo:

from os import popen 

try: 
    popen('echo hi') 
    doSomethingIllegal; 
except: 
    import logging     #Module called only when needed? 
    logging.exception("Record to logger) 

o se trata optimizado por el compilador de la misma manera que:

from os import popen 
import logging      #Module will always loaded regardless 

try: 
    popen('echo hi') 
    doSomethingIllegal; 
except: 
    logging.exception("Record to logger) 

Respuesta

10

This indica que puede hacer una diferencia:

declaraciones de importación" se puede ejecutar casi en cualquier parte. A menudo es útil colocarlos dentro de las funciones para restringir su visibilidad y/o reducir el tiempo de inicio inicial. Aunque el intérprete de Python se optimiza para no importar el mismo módulo varias veces, ejecutar repetidamente una sentencia import puede afectar seriamente el rendimiento en algunas circunstancias."

Estas dos preguntas OS, local import statements? y import always at top of module? discutir esto en detalle.

por último, si eres curioso acerca de su caso específico se podía perfil/referencia a sus dos alternativas en su entorno.

prefiero poner todas mis declaraciones de importación en la parte superior del archivo de origen, siguiendo stylis convenciones tic y por consistencia (también haría los cambios más fáciles más tarde sin tener que buscar en el archivo de origen buscando declaraciones de importación dispersas)

+0

Todavía un poco confundido. ¿De todos modos, el cargador NO tendrá que cargar el módulo externo, solo en caso de que se llame a una excepción? La única sobrecarga que puedo ver es solo una línea adicional de código en la excepción. – tetris11

+1

Simplemente sea claro en su código, haga sus importaciones en la parte superior del archivo. –

+0

@JakobBowyer Pero cuál es la diferencia, en lo que respecta al rendimiento es lo que realmente estoy preguntando – tetris11

2

La regla general es que las importaciones deben estar en la parte superior del archivo , ya que hace que el código sea más fácil de seguir, y eso hace que sea más fácil averiguar qué necesitará un módulo sin tener que pasar por todo el código.

La guía de estilo de Python cubre algunas pautas básicas para las importaciones de cómo deben mirar: http://www.python.org/dev/peps/pep-0008/#imports

En la práctica, sin embargo, hay ocasiones en las que tiene sentido para importar desde dentro de una función en particular. Esto viene a colación con las importaciones que sería circular:

# Module 1 
from module2 import B 

class A(object): 
    def do_something(self): 
     my_b = B() 
     ... 

# Module 2 
from module1 import A 

class B(object): 
    def do_something(self): 
     my_a = A() 
     ... 

que no funciona como es, pero se puede conseguir alrededor de la circularidad moviendo la importación:

# Module 1 
from module2 import B 

class A(object): 
    def do_something(self): 
     my_b = B() 
     ... 

# Module 2 
class B(object): 
    def do_something(self): 
     from module1 import A 
     my_a = A() 
     ... 

Lo ideal sería diseñar el clases tales que nunca aparecerían, y tal vez incluso incluirlas en el mismo módulo. En ese ejemplo de juguete, tener cada importación del otro realmente no tiene sentido. Sin embargo, en la práctica, hay algunos casos en los que tiene más sentido incluir una importación para un método dentro del método en sí, en lugar de tirar todo en el mismo módulo, o extraer el método en cuestión a otro objeto.

Pero, a menos que tenga una buena razón para desviarse, digo que vaya con la convención de la parte superior del módulo.

Cuestiones relacionadas