L'importazione del modulo non spreca nulla ; il modulo viene sempre completamente importato (nella sys.modules
mappatura), quindi sia che tu usi import sys
o from sys import argv
non faccia alcuna probabilità.
L'unica differenza tra le due affermazioni è il nome associato; import sys
associa il nome sys
al modulo (quindi sys
-> sys.modules['sys']
), mentre from sys import argv
associa un nome diverso argv
, indicando direttamente l'attributo contenuto all'interno del modulo (quindi argv
-> sys.modules['sys'].argv
). Il resto del sys
modulo è ancora lì, indipendentemente dal fatto che tu usi qualcos'altro dal modulo.
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 cercare l'attributo argv
. E sì, usando from sys import argv
puoi saltare la ricerca dell'attributo, poiché hai già un riferimento diretto all'attributo. Ma la import
dichiarazione deve ancora fare quel lavoro, cerca lo stesso attributo durante l'importazione e dovrai usarla argv
una sola volta . Se dovessi usarlo argv
migliaia di volte in un ciclo, forse potrebbe fare la differenza, ma in questo caso specifico non lo è.
La scelta tra l'uno o l'altro, quindi, dovrebbe basarsi sullo stile di codifica .
In un modulo di grandi dimensioni , certamente userei import sys
; la documentazione del codice è importante e l'utilizzo sys.argv
da qualche parte in un modulo di grandi dimensioni rende molto più chiaro ciò a cui ti riferisci di quanto non faccia argv
mai.
Se l'unico posto che usi argv
è in un '__main__'
blocco per chiamare una main()
funzione, usa sicuramente from sys import argv
se ti senti più felice a riguardo:
if __name__ == '__main__':
from sys import argv
main(argv)
Userei ancora import sys
lì da solo. A parità di condizioni (e lo sono esattamente in termini di prestazioni e numero di personaggi usati per scriverlo), per me è solo più facile da vedere.
Se stai importando qualcos'altro , forse entra in gioco la performance. Ma solo se usi un nome specifico in un modulo più volte , ad esempio in un ciclo critico. 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)