Importar el módulo no desperdicia nada ; el módulo siempre se importa completamente (en el sys.modules
mapeo), por lo tanto, si lo usa import sys
o from sys import argv
no tiene probabilidades.
La única diferencia entre las dos declaraciones es qué nombre está vinculado; import sys
vincula el nombre sys
al módulo (so sys
-> sys.modules['sys']
), mientras que from sys import argv
vincula un nombre diferente argv
, apuntando directamente al atributo contenido dentro del módulo (so argv
-> sys.modules['sys'].argv
). El resto del sys
mó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.argv
tiene que buscar dos cosas; tiene que buscar sys
en su espacio de nombres global (encuentra el módulo), luego busque el atributo argv
. Y sí, al usar from sys import argv
puede omitir la búsqueda de atributos, ya que ya tiene una referencia directa al atributo. Pero la import
declaració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 argv
miles 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.argv
en algún lugar de un módulo grande deja mucho más claro a qué se refiere que argv
nunca.
Si el único lugar que usa argv
es en un '__main__'
bloque para llamar a una main()
función, utilícelo from sys import argv
si se siente más feliz al respecto:
if __name__ == '__main__':
from sys import argv
main(argv)
Todavía lo usaría import sys
yo 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)