2011-10-04 7 views
7

Estoy ejecutando un sitio web usando Django, e importo ipdb al principio de casi todos mis scripts para facilitar la depuración. Sin embargo, la mayor parte del tiempo nunca uso las funciones del módulo (solo cuando estoy depurando).¿Importar un módulo (pero no usarlo) disminuye el rendimiento en Python?

Solo me pregunto, ¿esto disminuirá mi rendimiento? Es sólo que cuando quiero crear un punto de interrupción prefiero escribir:

ipdb.set_trace() 

en contraposición a:

import ipdb; ipdb.set_trace() 

Pero he visto el segundo ejemplo hecho en varios lugares, lo que hace que me pregunte si es más eficiente ...

Simplemente no sé cómo la importación de módulos de python se relaciona con la eficiencia (suponiendo que no está utilizando los métodos del módulo dentro de su secuencia de comandos).

Respuesta

4

Como se mencionó @wRAR, La carga de un módulo puede implicar la ejecución de cualquier cantidad de código que puede tomar cualquier cantidad de tiempo. Por otro lado, el módulo solo se cargará una vez y cualquier intento posterior de importación encontrará el módulo presente en os.sys.modules y la referencia a eso.

En un entorno Django en el modo debuging, los módulos se eliminan de Django de AppCache y en realidad re-importados sólo cuando se cambian, lo que es probable que no va a hacer con ipdb, por lo que en su caso no debería ser un problema.

Sin embargo, en algunos casos sería un problema, hay algunas formas de evitarlo.Suponga que tiene un módulo personalizado que se utiliza para cargar todos modos, se puede agregar una función a lo que las importaciones ipdb sólo cuando así lo requieran:

# much used module: mymodule 
def set_trace(): 
    import ipdb 
    ipdb.set_trace() 

en el módulo que desea utilizar ipdb.set_trace:

import mymodule 

mymodule.set_trace() 

o, en la parte superior de su módulo, utilice el módulo cruz __debug__ variables:

if __debug__: 
    from ipdp import set_trace 
else: 
    def set_trace(): return 
+0

¿Importar un módulo (pero no usarlo) disminuye el rendimiento en Python? Esa es la pregunta – joaquin

+1

De hecho @joaquin, ya estaba en el proceso de mi edición anterior cuando escribiste tu comentario;). Algunos pueden no estar de acuerdo, pero este es también un gran lugar para dar un consejo orientado a la resolución de problemas a quién le interesa la pregunta. – Remi

+0

¡Gracias! Y aprecié los ejemplos prácticos. =) –

2

Respuesta corta: Por lo general no

Respuesta larga:

Se necesitará tiempo para cargar el módulo. Esto puede ser notable si está cargando Python desde una unidad de red u otra fuente lenta. Pero si se ejecuta directamente desde un disco duro, nunca lo notarás.

Como señala @wRar, la importación de un módulo puede ejecutar cualquier cantidad de código. Puede tener el código que quiera ejecutar al inicio del módulo. Sin embargo, la mayoría de los módulos evitan la ejecución de cantidades irrazonables de código durante el inicio. Entonces eso probablemente no sea una gran causa.

Sin embargo, la importación de módulos muy grandes, especialmente aquellos que también resultan en la importación de un gran número de módulos c llevará tiempo.

Por lo tanto, la importación llevará tiempo, pero solo una vez por cada módulo importado. Si importa módulos en la parte superior de sus módulos (a diferencia de en funciones), solo se aplica al tiempo de inicio de todos modos. Básicamente, no obtendrá mucho rendimiento de optimización evitando importar módulos.

+0

@JBernardo: Tienes razón, lo he notado, y 'scipy' es mucho más lento todavía, así que generalmente solo importo las funciones que realmente uso (' from scipy import foo, bar, spam') – heltonbiker

+1

Cargando un módulo puede implicar la ejecución de cualquier cantidad de código que puede tomar cualquier cantidad de tiempo. – wRAR

+0

@wRAR, tienes razón. –

0

Importación de un módulo, pero no usarlo Decre ASES (el sistema) rendimiento:

  1. Se necesita tiempo para importar el módulo
  2. módulos importados utilizan memoria

Mientras que el primer punto hace que su programa más lento para empezar, el segundo punto podría hacer TODOS sus programas son más lentos, dependiendo de la cantidad total de memoria que tenga en su sistema.

Cuestiones relacionadas