Страницы

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

воскресенье, 22 декабря 2019 г.

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

#python


Разбирая чужой код, наткнулся на подобный фрагмент:

@property
def foo(self):
    from some_module import something
    return something['some_param']


Насколько хорошим решением является использование импорта в коде, который должен
исполняться многократно и быстро? (а ведь тяжёлые функции не рекомендуется оформлять
как propety).

Будет ли импорт каждый раз выполняться при вызове этого свойства или интерпретатор
в таких случаях выполняет импорт только один раз?
    


Ответы

Ответ 1



Хотя интерпретатор кэширует модуль после 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

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

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