2011-10-04 9 views
7

Sto eseguendo un sito Web utilizzando Django e importando ipdb all'inizio di quasi tutti i miei script per semplificare il debug. Tuttavia, la maggior parte delle volte non uso mai le funzioni dal modulo (solo quando eseguo il debug).L'importazione di un modulo (ma non l'uso) riduce le prestazioni in Python?

Mi chiedo solo, questo diminuirà la mia prestazione? E 'solo che quando voglio creare un punto di interruzione preferisco scrivere:

ipdb.set_trace() 

in contrapposizione a:

import ipdb; ipdb.set_trace() 

Ma ho visto il secondo esempio fatto in diversi luoghi, il che mi fa chiedere se è più efficiente ...

Semplicemente non so come l'importazione dei moduli python si riferisce all'efficienza (presupponendo che non si stiano utilizzando i metodi del modulo all'interno del proprio script).

risposta

4

Come @wRAR menzionato, Il caricamento di un modulo può implicare l'esecuzione di qualsiasi quantità di codice che può richiedere un tempo qualsiasi. D'altra parte, il modulo verrà caricato solo una volta e ogni successivo tentativo di importazione troverà il modulo presente in os.sys.modules e farà riferimento a questo.

In un ambiente di Django in modalità debuging, i moduli vengono rimossi dal Django di AppCache e in realtà re-importati solo quando sono cambiati, che probabilmente non fa con ipdb, così nel tuo caso non dovrebbe essere un problema.

Tuttavia, nei casi in cui sarebbe un problema, ci sono alcuni modi per aggirarlo.Supponiamo di avere un modulo personalizzato che si utilizza per caricare in ogni caso, è possibile aggiungere una funzione ad essa che le importazioni ipdb solo quando si richiedono:

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

nel modulo che si desidera utilizzare ipdb.set_trace:

import mymodule 

mymodule.set_trace() 

o, sulla parte superiore del modulo, utilizzare il cross-modulo __debug__ variabile:

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

L'importazione di un modulo (ma non l'uso) riduce le prestazioni in Python? Questa è la domanda – joaquin

+1

In effetti @joaquin, ero già nel processo della mia modifica sopra quando hai scritto il tuo commento;). Alcuni potrebbero non essere d'accordo, ma questo è anche un ottimo posto per dare consigli orientati alla risoluzione dei problemi a chi è interessato alla domanda. – Remi

+0

Grazie! E ho apprezzato gli esempi pratici. =) –

2

Risposta breve: Di solito non

Risposta lunga:

Ci vorrà del tempo per caricare il modulo. Questo potrebbe essere evidente se stai caricando python da un'unità di rete o da un'altra sorgente lenta. Ma se si esegue direttamente da un disco fisso non si noterà mai.

Come sottolinea @wRar, l'importazione di un modulo può eseguire qualsiasi quantità di codice. Puoi avere qualunque codice tu desideri eseguito all'avvio del modulo. Tuttavia, molti moduli evitano di eseguire quantità di codice irragionevoli durante l'avvio. Quindi, probabilmente non è una causa enorme.

Tuttavia, l'importazione di moduli molto grandi, in particolare quelli che comportano anche l'importazione di un numero elevato di moduli c, richiederà tempo.

Quindi l'importazione richiederà tempo, ma solo una volta per modulo importato. Se si importano i moduli nella parte superiore dei moduli (al contrario delle funzioni), si applica comunque solo al tempo di avvio. Fondamentalmente, non avrai molta ottimizzazione del chilometraggio evitando di importare moduli.

+0

@JBernardo: hai ragione, l'ho notato, e 'scipy' è molto più lento, quindi di solito importa solo le funzioni che effettivamente uso (' da scipy import foo, bar, spam') – heltonbiker

+1

Caricamento un modulo può implicare l'esecuzione di qualsiasi quantità di codice che può richiedere una quantità di tempo. – wRAR

+0

@wRAR, sei corretto. –

0

importazione di un modulo, ma non lo si utilizza decre Ases (il sistema) prestazioni:

  1. Ci vuole tempo per importare il modulo
  2. moduli importati utilizzano la memoria

Mentre il primo punto rende il vostro programma più lento per iniziare, il secondo punto potrebbe fare TUTTI i tuoi programmi più lenti, a seconda della quantità totale di memoria che hai sul tuo sistema.