A importação do módulo não desperdiça nada ; o módulo é sempre totalmente importado (para o sys.modules
mapeamento), portanto, se você usa import sys
ou from sys import argv
não faz nenhuma diferença.
A única diferença entre as duas instruções é qual nome é vinculado; import sys
vincula o nome sys
ao módulo (então sys
-> sys.modules['sys']
), enquanto from sys import argv
vincula um nome diferente argv
, apontando diretamente para o atributo contido dentro do módulo (então argv
-> sys.modules['sys'].argv
). O restante do sys
mó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.argv
tem que procurar duas coisas; ele tem que olhar-se sys
no espaço de nomes global (encontra o módulo), em seguida, procurar o atributo argv
. E sim, usando from sys import argv
você pode pular a pesquisa de atributo, pois você já tem uma referência direta ao atributo. Mas a import
instruçã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 argv
milhares 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.argv
em algum lugar de um módulo grande torna muito mais claro o que você está se referindo do que argv
jamais faria.
Se o único lugar que você usa argv
é em um '__main__'
bloco para chamar uma main()
função, use-o from sys import argv
se você se sentir mais feliz com isso:
if __name__ == '__main__':
from sys import argv
main(argv)
Eu ainda usaria import sys
lá. 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)