Снижает ли импорт модуля (но не его использование) производительность в Python?


Я запускаю веб-сайт с помощью Django,и я импортирую ipdb в начале почти всех моих сценариев, чтобы упростить отладку. Однако большую часть времени я никогда не использую функции из модуля (только во время отладки).

Просто интересно, снизит ли это мою производительность? Просто, когда я хочу создать точку останова, я предпочитаю писать:

ipdb.set_trace()

В отличие от:

import ipdb; ipdb.set_trace()

Но я видел второй пример, сделанный в нескольких местах, что заставляет меня задуматься, не является ли он более эффективный...

Я просто не знаю, как импорт модулей python связан с эффективностью (предполагая, что вы не используете методы модуля в своем скрипте).

3 7

3 ответа:

Как упоминалось в @wRAR, загрузка модуля может означать выполнение любого количества кода, которое может занять любое количество времени . С другой стороны, модуль будет загружен только один раз, и любая последующая попытка импорта найдет модуль, присутствующий в os.sys.modules, и ссылку на него.

В среде Django в режиме отладки модули удаляются из среды Django.AppCache и фактически реимпортируются только тогда, когда они изменены, чего вы, вероятно, не сделаете с ipdb, поэтому в вашем дело в том, что это не должно быть проблемой.

Тем не менее, в тех случаях, когда это будет проблемой, есть несколько способов обойти ее. Предположим, у вас есть пользовательский модуль, который вы используете для загрузки в любом случае, вы можете добавить к нему функцию, которая импортирует ipdb только тогда, когда вам это требуется:
# much used module: mymodule
def set_trace():
    import ipdb
    ipdb.set_trace()

В модуле, который вы хотите использовать ipdb.set_trace:

import mymodule

mymodule.set_trace()

Или, поверх вашего модуля, используйте переменную cross-module __debug__:

if __debug__:
    from ipdp import set_trace
else:
    def set_trace(): return

Короткий ответ: обычно нет

Длинный ответ:

Загрузка модуля займет некоторое время. Это может быть заметно, если вы загружаете python с сетевого диска или другого медленного источника. Но если вы работаете непосредственно с жесткого диска, вы никогда не заметите.

Как указывает @wRar, импорт модуля может выполнить любое количество кода. Вы можете иметь любой код, который вы хотите выполнить при запуске модуля. Однако большинство модулей избегают выполнения неоправданных объемов кода во время запуска. Так чтобы сама по себе, вероятно, не является огромной причиной.

Однако импорт очень больших модулей, особенно тех, которые также приводят к импорту большого количества модулей c, потребует времени.

Таким образом, импорт займет некоторое время, но только один раз за импортированный модуль. Если вы импортируете модули в верхней части ваших модулей (в отличие от функций in), это в любом случае относится только ко времени запуска. В принципе, вы не получите большого пробега оптимизации, избегая импорта модулей.

Импорт модуля, но не его использование снижает производительность системы:

  1. требуется время, чтобы импортировать модуль
  2. импортированные модули используют память

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