2012-05-20 21 views
8

Importa dove i moduli sono caricati in un codice? O dovrebbero essere tutti dichiarati nella parte superiore, poiché durante il caricamento i moduli esterni dovranno essere caricati indipendentemente da dove sono stati dichiarati nel codice ...?Python: ottimizzazione delle importazioni

Esempio:

from os import popen 

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

o è presente ottimizzata dal compilatore stesso modo:

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

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

risposta

10

This indica che può fare la differenza:

istruzioni import" può essere eseguita praticamente ovunque Spesso è utile metterli all'interno delle funzioni per limitare la loro visibilità e/o ridurre il tempo di avvio iniziale. Anche se l'interprete di Python è ottimizzato per non importare lo stesso modulo più volte, più volte l'esecuzione di un'istruzione di importazione può seriamente influire sulle prestazioni in alcune circostanze."

Queste due domande OS, local import statements? e import always at top of module? discutere di questo a lungo.

Infine, se siete curiosi di sapere la vostra specifica caso si potrebbe profilo/benchmark le due alternative nel proprio ambiente.

preferisco mettere tutte le mie istruzioni import nella parte superiore del file di origine, a seguito Stylis tic convenzioni e per coerenza (inoltre renderebbe più facili le modifiche in seguito senza dover cercare il file sorgente cercando istruzioni import sparse ovunque)

+0

Ancora un po 'confuso. Il caricatore non deve caricare comunque il modulo esterno, nel caso venga chiamata un'eccezione? L'unico sovraccarico che riesco a vedere è solo una riga aggiuntiva di codice nell'eccezione. – tetris11

+1

Basta essere chiari nel codice, fare le importazioni nella parte superiore del file. –

+0

@JakobBowyer Ma qual è la differenza, il rendimento è quello che sto davvero chiedendo – tetris11

2

La regola generale è che le importazioni dovrebbero essere nella parte superiore del file , in quanto rende il codice più facile da seguire, e questo rende più facile capire di cosa un modulo avrà bisogno senza dover passare attraverso tutto il codice.

La Python guida di stile copre alcune linee guida fondamentali su come le importazioni dovrebbero guardare: http://www.python.org/dev/peps/pep-0008/#imports

In pratica, però, ci sono momenti in cui ha senso importare da all'interno di una particolare funzione. Questo si presenta con le importazioni che sarebbero circolare:

# 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() 
     ... 

che non funzionano come è, ma si potrebbe aggirare la circolarità spostando l'importazione:

# 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() 
     ... 

Idealmente, si dovrebbe progettare il classi tali che questo non sarebbe mai venuto fuori, e forse anche includerli nello stesso modulo. In quell'esempio di giocattolo, avere l'uno l'altro in realtà non ha senso. Tuttavia, in pratica, ci sono alcuni casi in cui ha più senso includere un'importazione per un metodo all'interno del metodo stesso, piuttosto che gettare tutto nello stesso modulo o estrarre il metodo in questione in qualche altro oggetto.

Ma, a meno che non si abbia una buona ragione per deviare, dico andare con la convenzione top-of-the-module.