Импорт модуль не тратит ничего ; модуль всегда полностью импортируется (в sys.modules
отображение), поэтому вы не используете его import sys
или from sys import argv
не делаете разногласий.
Единственная разница между этими двумя утверждениями заключается в том, какое имя связано; import sys
привязывает имя sys
к модулю (так sys
-> sys.modules['sys']
), в то время как from sys import argv
связывает другое имя argv
, указывая прямо на атрибут, содержащийся внутри модуля (так argv
-> sys.modules['sys'].argv
). Остальная часть sys
модуля все еще там, используете ли вы что-нибудь еще из модуля или нет.
Также нет разницы в производительности между этими двумя подходами. Да, sys.argv
должен искать две вещи; он должен искать sys
в вашем глобальном пространстве имен (находит модуль), а затем искать атрибут argv
. И да, используя его, from sys import argv
вы можете пропустить поиск атрибута, поскольку у вас уже есть прямая ссылка на атрибут. Но import
оператор все еще должен выполнять эту работу, он ищет тот же атрибут при импорте, и вам нужно будет использовать его argv
только один раз . Если бы вам пришлось использовать argv
тысячи раз в цикле, это могло бы иметь значение, но в данном конкретном случае это действительно не так.
Выбор между тем или другим должен основываться на стиле кодирования .
В большом модуле я бы обязательно использовал import sys
; Документация по коду имеет значение, и использование sys.argv
где-то в большом модуле делает намного более понятным то, на что вы ссылаетесь, чем argv
когда-либо.
Если единственное место, которое вы используете, argv
находится в '__main__'
блоке для вызова main()
функции, во что from sys import argv
бы то ни стало используйте, если вы чувствуете себя счастливее по этому поводу:
if __name__ == '__main__':
from sys import argv
main(argv)
Я бы все еще использовал import sys
там сам. При прочих равных условиях (и они, в точности, с точки зрения производительности и количества символов, использованных для его написания), для меня это просто на глаз.
Если вы импортируете что - то другое , то, возможно, производительность вступит в игру. Но только если вы используете определенное имя в модуле много раз , например в критическом цикле. Но тогда создание локального имени (внутри функции) будет еще быстрее:
import somemodule
def somefunction():
localname = somemodule.somefunctionorother
while test:
# huge, critical loop
foo = localname(bar)