Importar el módulo no desperdicia nada ; el módulo siempre se importa completamente (en el sys.modulesmapeo), por lo tanto, si lo usa import syso from sys import argvno tiene probabilidades.
La única diferencia entre las dos declaraciones es qué nombre está vinculado; import sysvincula el nombre sysal módulo (so sys-> sys.modules['sys']), mientras que from sys import argvvincula un nombre diferente argv, apuntando directamente al atributo contenido dentro del módulo (so argv-> sys.modules['sys'].argv). El resto del sysmódulo todavía está allí, ya sea que use algo más del módulo o no.
Tampoco hay diferencia de rendimiento entre los dos enfoques. Sí, sys.argvtiene que buscar dos cosas; tiene que buscar sysen su espacio de nombres global (encuentra el módulo), luego busque el atributo argv. Y sí, al usar from sys import argvpuede omitir la búsqueda de atributos, ya que ya tiene una referencia directa al atributo. Pero la importdeclaración aún tiene que hacer ese trabajo, busca el mismo atributo al importar, y solo necesitará usar argv una vez . Si tuviera que usar argvmiles de veces en un bucle, tal vez podría hacer una diferencia, pero en este caso específico realmente no lo hace.
La elección entre uno u otro debe basarse en el estilo de codificación .
En un módulo grande , ciertamente lo usaría import sys; la documentación del código es importante, y el uso sys.argven algún lugar de un módulo grande deja mucho más claro a qué se refiere que argvnunca.
Si el único lugar que usa argves en un '__main__'bloque para llamar a una main()función, utilícelo from sys import argvsi se siente más feliz al respecto:
if __name__ == '__main__':
from sys import argv
main(argv)
Todavía lo usaría import sysyo mismo. En igualdad de condiciones (y son, exactamente, en términos de rendimiento y número de caracteres utilizados para escribirlo), eso es más fácil para mí.
Si está importando algo completamente diferente , entonces quizás el rendimiento entre en juego. Pero solo si usa un nombre específico en un módulo muchas veces , en un ciclo crítico, por ejemplo. Pero luego crear un nombre local (dentro de una función) va a ser aún más rápido:
import somemodule
def somefunction():
localname = somemodule.somefunctionorother
while test:
# huge, critical loop
foo = localname(bar)