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)