Importowanie modułu niczego nie marnuje ; moduł jest zawsze w pełni importowany (do sys.modulesmapowania), więc czy używasz go, import sysczy from sys import argvnie ma żadnych szans.
Jedyną różnicą między tymi dwoma instrukcjami jest to, jaka nazwa jest związana; import syswiąże nazwę sysz modułem (so sys-> sys.modules['sys']), a from sys import argvwiąże inną nazwę argv, wskazując prosto na atrybut zawarty w module (so argv-> sys.modules['sys'].argv). Reszta sysmoduł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.argvmusi szukać dwóch rzeczy; musi wyszukać sysw twojej globalnej przestrzeni nazw (znajduje moduł), a następnie wyszukać atrybut argv. I tak, używając from sys import argvmożesz pominąć wyszukiwanie atrybutów, ponieważ masz już bezpośrednie odwołanie do atrybutu. Ale importoś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ć argvtysią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.argvgdzieś w dużym module sprawia, że jest o wiele bardziej zrozumiałe, o czym mówisz, niż argvkiedykolwiek.
Jeśli jedynym miejscem, z którego korzystasz, argvjest '__main__'blok do wywołania main()funkcji, z pewnością użyj tej opcji, from sys import argvjeśli czujesz się szczęśliwszy z tego powodu:
if __name__ == '__main__':
from sys import argv
main(argv)
Nadal bym import systam 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)