Действительно, как уже отмечалось, обычно лучше следовать рекомендации PEP 8 и делать свой импорт сверху. Есть некоторые исключения, хотя. Ключ к их пониманию лежит во встроенном вопросе во втором абзаце: «На каком этапе происходит импорт ...?»
Импорт на самом деле является исполняемым оператором. При импорте модуля запускаются все исполняемые операторы в модуле. «def» также является исполняемым оператором; его выполнение вызывает привязку определенного имени к (уже скомпилированному) коду. Так что если у вас есть:
def f():
import something
return None
в модуле, который вы импортируете, (скомпилированные) операторы import и return связываются с именем «f» в этой точке. Когда вы запускаете f (), там выполняется оператор импорта.
Если вы отложите импорт чего-либо «очень большого» или «тяжелого», а затем никогда не запустите функцию (в данном случае f), импорт никогда не произойдет. Это экономит время (и немного места). Конечно, когда вы на самом деле вызываете f (), происходит импорт (если это уже произошло, когда Python использует кэшированный результат, но он все еще должен проверять), так что вы теряете свое преимущество во времени.
Следовательно, как правило, «импортируйте все наверху» до тех пор, пока вы не проведете много профилирования и не обнаружите, что импорт «огромный» тратит много времени на 90% ваших прогонов, по сравнению с сохранением мало времени у 10% из них.