L'importazione del modulo non spreca nulla ; il modulo viene sempre completamente importato (nella sys.modulesmappatura), quindi sia che tu usi import syso from sys import argvnon faccia alcuna probabilità.
L'unica differenza tra le due affermazioni è il nome associato; import sysassocia il nome sysal modulo (quindi sys-> sys.modules['sys']), mentre from sys import argvassocia un nome diverso argv, indicando direttamente l'attributo contenuto all'interno del modulo (quindi argv-> sys.modules['sys'].argv). Il resto del sysmodulo è 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.argvdeve cercare due cose; deve cercare sysnel tuo spazio dei nomi globale (trova il modulo), quindi cercare l'attributo argv. E sì, usando from sys import argvpuoi saltare la ricerca dell'attributo, poiché hai già un riferimento diretto all'attributo. Ma la importdichiarazione deve ancora fare quel lavoro, cerca lo stesso attributo durante l'importazione e dovrai usarla argv una sola volta . Se dovessi usarlo argvmigliaia 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.argvda qualche parte in un modulo di grandi dimensioni rende molto più chiaro ciò a cui ti riferisci di quanto non faccia argvmai.
Se l'unico posto che usi argvè in un '__main__'blocco per chiamare una main()funzione, usa sicuramente from sys import argvse ti senti più felice a riguardo:
if __name__ == '__main__':
from sys import argv
main(argv)
Userei ancora import syslì 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)