Імпорт модуль не витрачає нічого ; модуль завжди повністю імпортується (у 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)