Уменьшает ли импорт модуля (но не использует его) производительность в Python? - PullRequest
7 голосов
/ 04 октября 2011

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

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

ipdb.set_trace()

вместо:

import ipdb; ipdb.set_trace()

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

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

Ответы [ 3 ]

3 голосов
/ 04 октября 2011

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

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

Однако в случаях, когда это может быть проблемой, есть несколько способов обойти это. Предположим, у вас есть пользовательский модуль, который вы все равно используете для загрузки, вы можете добавить к нему функцию, которая импортирует ipdb только тогда, когда вам это нужно:

# much used module: mymodule
def set_trace():
    import ipdb
    ipdb.set_trace()

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

import mymodule

mymodule.set_trace()

или в верхней части модуля используйте переменную кросс-модуля __debug__:

if __debug__:
    from ipdp import set_trace
else:
    def set_trace(): return
2 голосов
/ 04 октября 2011

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

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

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

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

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

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

0 голосов
/ 04 октября 2011

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

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

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

...