Давайте посмотрим, как будет выглядеть байт-код для следующих двух функций:
def func1():
""" test imported each time function is run """
from task import test
test()
def func2():
""" test was imported at top of module """
test()
Как вы можете видеть ниже, func2()
экономит много шагов, используя глобально импортированную функцию test
.
>>> dis.dis(func1)
3 0 LOAD_CONST 1 (-1)
3 LOAD_CONST 2 (('test',))
6 IMPORT_NAME 0 (task)
9 IMPORT_FROM 1 (test)
12 STORE_FAST 0 (test)
15 POP_TOP
4 16 LOAD_FAST 0 (test)
19 CALL_FUNCTION 0
22 POP_TOP
23 LOAD_CONST 3 (None)
26 RETURN_VALUE
>>> dis.dis(func2)
3 0 LOAD_GLOBAL 0 (test)
3 CALL_FUNCTION 0
6 POP_TOP
7 LOAD_CONST 1 (None)
10 RETURN_VALUE
Принятие этого во внимание заранее, вероятно, является преждевременной оптимизацией, как указано в комментарии Делнана.
Что касается test
, находящегося в глобальном пространстве имен, то это вряд ли вызовет проблемы с производительностью поиска. Я думаю, что наиболее заметный способ, которым вы могли бы это увидеть, это наличие коллизии хеша для test
и другого имени, которое вы используете очень часто, что заставило поиск этого второго имени занять больше времени. Опять же, преждевременная оптимизация, чтобы рассмотреть этот редкий случай заранее.