L'importazione del modulo non spreca nulla ; il modulo è sempre fully importato (nella mappatura sys.modules
), quindi se usi import sys
o from sys import argv
non fa alcuna differenza.
L'unica differenza tra le due affermazioni è quale nome è associato; import sys
lega il nome sys
al modulo (quindi sys
- > sys.modules['sys']
), mentre from sys import argv
lega un nome diverso, argv
, puntando dritto all'attributo contenuto all'interno del modulo (quindi argv
- > sys.modules['sys'].argv
). Il resto del modulo sys
è ancora lì, indipendentemente dal fatto che tu usi qualcos'altro dal modulo o meno.
Non vi è inoltre alcuna differenza di prestazioni tra i due approcci. Sì, sys.argv
deve cercare due cose; deve cercare sys
nel tuo spazio dei nomi globale (trova il modulo), quindi cerca l'attributo argv
. E sì, usando from sys import argv
puoi saltare la ricerca degli attributi, dato che hai già un riferimento diretto all'attributo. Ma l'istruzione import
deve ancora funzionare, cerca lo stesso attributo durante l'importazione e dovrai sempre usare argv
una volta . Se dovessi usare argv
migliaia di volte in un ciclo, potrebbe forse fare la differenza, ma in questo caso specifico in realtà non lo è.
La scelta tra l'una o l'altra quindi, dovrebbe essere basata su stile di codifica , invece.
In un modulo grande , certamente utilizzerei import sys
; la documentazione del codice è importante e l'utilizzo di sys.argv
da qualche parte in un modulo di grandi dimensioni rende molto più chiaro a cosa ti stai riferendo che solo argv
mai.
Se l'unica posizione che usi argv
è in un blocco '__main__'
per chiamare una funzione main()
, usa assolutamente from sys import argv
se ti senti più felice a tale proposito:
if __name__ == '__main__':
from sys import argv
main(argv)
Userei ancora import sys
lì da solo. A parità di condizioni (e sono esattamente, in termini di prestazioni e numero di caratteri usati per scriverlo), per me è solo più facile da guardare.
Se stai importando qualcosa altro , allora forse le prestazioni entrano in gioco. Ma solo se usi un nome specifico in un modulo molte volte , in un ciclo critico per esempio. Ma poi creare un nome locale (all'interno di una funzione) sarà ancora più veloce:
import somemodule
def somefunction():
localname = somemodule.somefunctionorother
while test:
# huge, critical loop
foo = localname(bar)