A importação do módulo não desperdiça nada ; o módulo é sempre totalmente importado (para o sys.modulesmapeamento), portanto, se você usa import sysou from sys import argvnão faz nenhuma diferença.
A única diferença entre as duas instruções é qual nome é vinculado; import sysvincula o nome sysao módulo (então sys-> sys.modules['sys']), enquanto from sys import argvvincula um nome diferente argv, apontando diretamente para o atributo contido dentro do módulo (então argv-> sys.modules['sys'].argv). O restante do sysmódulo ainda está lá, se você usa mais alguma coisa do módulo ou não.
Também não há diferença de desempenho entre as duas abordagens. Sim, sys.argvtem que procurar duas coisas; ele tem que olhar-se sysno espaço de nomes global (encontra o módulo), em seguida, procurar o atributo argv. E sim, usando from sys import argvvocê pode pular a pesquisa de atributo, pois você já tem uma referência direta ao atributo. Mas a importinstrução ainda precisa fazer esse trabalho, ela procura o mesmo atributo ao importar e você só precisará usar argv uma vez . Se você tivesse que usar argvmilhares de vezes em um loop, talvez pudesse fazer a diferença, mas nesse caso específico, na verdade não.
A escolha entre um ou outro então deve basear-se no estilo de codificação .
Em um módulo grande , eu certamente usaria import sys; a documentação do código é importante e o uso sys.argvem algum lugar de um módulo grande torna muito mais claro o que você está se referindo do que argvjamais faria.
Se o único lugar que você usa argvé em um '__main__'bloco para chamar uma main()função, use-o from sys import argvse você se sentir mais feliz com isso:
if __name__ == '__main__':
from sys import argv
main(argv)
Eu ainda usaria import syslá. Todas as coisas são iguais (e são, exatamente, em termos de desempenho e número de caracteres usados para escrevê-lo), isso é apenas mais fácil para mim.
Se você estiver importando outra coisa , talvez o desempenho entre em jogo. Mas somente se você usar um nome específico em um módulo várias vezes , em um loop crítico, por exemplo. Mas a criação de um nome local (dentro de uma função) será ainda mais rápida:
import somemodule
def somefunction():
localname = somemodule.somefunctionorother
while test:
# huge, critical loop
foo = localname(bar)