Importowanie modułu niczego nie marnuje ; moduł jest zawsze w pełni importowany (do sys.modules
mapowania), więc czy używasz go, import sys
czy from sys import argv
nie ma żadnych szans.
Jedyną różnicą między tymi dwoma instrukcjami jest to, jaka nazwa jest związana; import sys
wiąże nazwę sys
z modułem (so sys
-> sys.modules['sys']
), a from sys import argv
wiąże inną nazwę argv
, wskazując prosto na atrybut zawarty w module (so argv
-> sys.modules['sys'].argv
). Reszta sys
modułu nadal tam jest, niezależnie od tego, czy używasz czegokolwiek innego z modułu, czy nie.
Nie ma również różnicy w wydajności między tymi dwoma podejściami. Tak, sys.argv
musi szukać dwóch rzeczy; musi wyszukać sys
w twojej globalnej przestrzeni nazw (znajduje moduł), a następnie wyszukać atrybut argv
. I tak, używając from sys import argv
możesz pominąć wyszukiwanie atrybutów, ponieważ masz już bezpośrednie odwołanie do atrybutu. Ale import
oświadczenie wciąż musi wykonać tę pracę, wyszukuje ten sam atrybut podczas importowania i będziesz musiał użyć argv
tylko raz . Gdybyś musiał użyć argv
tysiące razy w pętli, mogłoby to mieć znaczenie, ale w tym konkretnym przypadku tak naprawdę nie jest.
Wybór między jednym a drugim powinien zatem opierać się na stylu kodowania .
W dużym module z pewnością skorzystałbym import sys
; dokumentacja kodu ma znaczenie, a użycie sys.argv
gdzieś w dużym module sprawia, że jest o wiele bardziej zrozumiałe, o czym mówisz, niż argv
kiedykolwiek.
Jeśli jedynym miejscem, z którego korzystasz, argv
jest '__main__'
blok do wywołania main()
funkcji, z pewnością użyj tej opcji, from sys import argv
jeśli czujesz się szczęśliwszy z tego powodu:
if __name__ == '__main__':
from sys import argv
main(argv)
Nadal bym import sys
tam używał . Wszystkie rzeczy są równe (i są one dokładnie pod względem wydajności i liczby znaków użytych do napisania tego), dla mnie jest to po prostu łatwiejsze.
Jeśli importujesz coś zupełnie innego , być może w grę wchodzi wydajność. Ale tylko jeśli wielokrotnie użyjesz określonej nazwy w module , na przykład w krytycznej pętli. Ale tworzenie nazwy lokalnej (w ramach funkcji) będzie jeszcze szybsze:
import somemodule
def somefunction():
localname = somemodule.somefunctionorother
while test:
# huge, critical loop
foo = localname(bar)