Python оптимизирует модули, когда они импортируются многократно?

48
задан Nabeel Ahmed 11 April 2013 в 07:30
поделиться

6 ответов

Модули Python можно было рассмотреть как одиночные элементы..., неважно, сколько раз Вы импортируете их, они инициализируются только однажды, таким образом, лучше сделать:

import MyLib
import ReallyBigLib

Соответствующая документация в операторе импорта:

https://docs.python.org/2/reference/simple_stmts.html#the-import-statement

Однажды название модуля известен (если иначе не определено, термин “module” отнесется и к пакетам и к модулям), ища модуль, или пакет может начаться. Проверенное первое место является sys.modules, кэшем всех модулей, которые были импортированы ранее. Если модуль найден там тогда, он используется на шаге (2) импорта.

импортированные модули кэшируются в sys.modules:

Это - словарь, который отображает имена модуля к модулям, которые были уже загружены. Этим можно управлять для принуждения перезагрузки модулей и других приемов. Обратите внимание, что удаление модуля из этого словаря не является тем же как называющий перезагрузку () на соответствующем объекте модуля.

69
ответ дан Toni Ruža 7 November 2019 в 12:14
поделиться

Как другие указали, Python ведет внутренний список всех модулей, которые были импортированы. При импорте модуля впервые модуль (сценарий) выполняется в его собственном пространстве имен, пока конец, внутренний список не обновляется, и выполнение продолжается после оператора импорта.

Попытка этот код:

   # module/file a.py
   print "Hello from a.py!"
   import b

   # module/file b.py
   print "Hello from b.py!"
   import a

нет никакого цикла: существует только поиск кэша.

>>> import b
Hello from b.py!
Hello from a.py!
>>> import a
>>>

Одна из красот Python - то, как все передает к выполнению сценария в пространстве имен.

37
ответ дан Charles Merriam 7 November 2019 в 12:14
поделиться

Это не имеет никакого существенного значения. Если большой модуль был уже загружен, второй импорт в Вашем втором примере не делает ничего кроме добавления 'ReallyBigLib' к текущему пространству имен.

8
ответ дан Federico A. Ramponi 7 November 2019 в 12:14
поделиться

Внутренний реестр импортированных модулей sys.modules словарь, который отображает имена модуля к объектам модуля. Можно посмотреть там для наблюдения всех модулей, которые в настоящее время импортируются.

можно также вытянуть некоторые полезные приемы (если Вам нужно к) monkeying с sys.modules - например, добавление Ваших собственных объектов как псевдомодули, которые могут быть импортированы другими модулями.

3
ответ дан babbageclunk 7 November 2019 в 12:14
поделиться

Это - тот же performancewise. Еще нет никакого JIT-компилятора в Python.

0
ответ дан Marko 7 November 2019 в 12:14
поделиться

WARNING: Python does not guarantee that module will not be initialized twice. I've stubled upon such issue. See discussion: http://code.djangoproject.com/ticket/8193

6
ответ дан 7 November 2019 в 12:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: