В Python, что происходит при импорте внутри функции? [дубликат]



этот вопрос уже есть ответ здесь:




  • Должны ли операторы импорта всегда находиться в верхней части модуля?

    17 ответов



каковы плюсы и минусы импорта модуля Python и/или функции внутри функции, эффективность и скорость памяти?



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

675   6  

6 ответов:

выполняется ли повторный импорт при каждом запуске функции?

нет; или, скорее, модули Python по существу кэшируются каждый раз, когда они импортируются, поэтому импортируется второй (или третий, или четвертый...) время на самом деле не заставляет их снова проходить весь процесс импорта.

импортируется ли он один раз в начале независимо от того, запущена ли функция?

нет, он импортируется только в том случае, если и когда функция выполненный.

что касается преимуществ: это зависит, я думаю. Если вы можете запускать функцию очень редко и не нуждаетесь в импорте модуля в другом месте, это мая полезно только импортировать его в этой функции. Или если есть конфликт или другой причине вы не хотите модуль или символы из модуля везде, вы можете только импортировать его в определенной функции. (Конечно, всегда есть from my_module import my_function as f для тех, случаи.)

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

в первый раз import goo из любого места (внутри или снаружи функции),goo.py (или другая импортируемая форма) загружается и sys.modules['goo'] устанавливается на объект модуля, построенный таким образом. Любой будущий импорт в рамках того же запуска программы (Опять же, будь то внутри или вне функции) просто посмотрите вверх sys.modules['goo'] и привязать его к barename goo в соответствующей области. Поиск dict и привязка имени-это очень быстрые операции.

предполагая, что самый первый import получает совершенно амортизируется в течение выполнения программы в любом случае, имея "соответствующую область" на уровне модуля, означает каждое использование goo.this,goo.that и т. д.-Это два поиска dict - один для goo и один для имени атрибута. Наличие "уровня функции" оплачивает один дополнительный параметр локальной переменной за запуск функции (даже быстрее, чем часть поиска по словарю!) но сохраняет один поиск dict (обменивая его на поиск локальной переменной, невероятно быстро) для каждого goo.this (etc) доступ, в основном вдвое сокращая время таких поиски берут.

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

это все еще оптимизация, которая стоит только в довольно экстремальных ситуациях, и есть много других, которые я бы рассмотрел, прежде чем пытаться выжать микросекунды таким образом.

он импортирует один раз, когда функция выполняется в первый раз.

плюсы:

  • импорт, связанный с функцией, которую они используют в
  • легко перемещать функции вокруг пакета

плюсы:

  • не мог видеть, какие модули этот модуль может зависеть от

импорт внутри функции будет эффективно импортировать модуль один раз.. при первом запуске функции.

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

Если это не он причина, по которой вы это делаете, это почти наверняка отвратительная идея.

могу ли я предложить в целом, что вместо того, чтобы спрашивать: "улучшит ли X мою производительность?"вы используете профилирование, чтобы определить, где находится ваша программа на самом деле тратить свое время, а затем применять оптимизацию в соответствии с тем, где вы получите наибольшую выгоду?

и затем вы можете использовать профилирование, чтобы убедиться, что ваши оптимизации действительно принесли вам пользу.

он импортирует один раз, когда функция вызывается в первый раз.

Я мог бы представить, что делаю это таким образом, если бы у меня была функция в импортированном модуле, которая используется очень seldomly и является единственной, требующей импорта. Хотя выглядит довольно надуманно...

Comments

    Ничего не найдено.