Разбирая чужой код, наткнулся на подобный фрагмент:
@property
def foo(self):
from some_module import something
return something['some_param']
Насколько хорошим решением является использование импорта в коде, который должен исполняться многократно и быстро? (а ведь тяжёлые функции не рекомендуется оформлять как propety).
Будет ли импорт каждый раз выполняться при вызове этого свойства или интерпретатор в таких случаях выполняет импорт только один раз?
Ответ
Хотя интерпретатор кэширует модуль после 1 импорта, 2 импорт все равно не будет выполняется быстро. Поэтому, а также для увеличение понятности кода рекомендуют весь импорт помещать наверх а не в функции. Поэтому код:
@property
def foo(self):
from some_module import something
return something['some_param']
неправильный. from some_module import something надо поднять наверх. Хотя стоит заметить что в отдельных случаях (решение проблем импорта например) такой код может быть "оправдан".
P.S: Замер скорости импорта.
Код:
from timeit import timeit
def slow():
for i in range(1000):
import os
def fast():
import os
for i in range(1000):
pass
def stub():
for i in range(1000):
pass
Замеры:
timeit("slow()", "from __main__ import slow, fast, stub", number=1000)
3.3150182569997924
timeit("fast()", "from __main__ import slow, fast, stub", number=1000)
0.15638045699961367
timeit("stub()", "from __main__ import slow, fast, stub", number=1000)
0.15032413299923064
Комментариев нет:
Отправить комментарий