Страницы

Поиск по вопросам

среда, 14 ноября 2018 г.

Импорт в коде, который выполняется много раз

Разбирая чужой код, наткнулся на подобный фрагмент:
@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

Комментариев нет:

Отправить комментарий