tag Em Python, o que acontece quando você importa dentro de uma função?




tag mp3 python (5)

Esta questão já tem uma resposta aqui:

Quais são os prós e contras de importar um módulo Python e / ou função dentro de uma função, com relação à eficiência da velocidade e da memória?

Ele reimporta toda vez que a função é executada, ou talvez apenas uma vez no começo, independentemente de a função ser executada ou não?


Ele importa uma vez quando a função é executada pela primeira vez.

Prós:

  • importações relacionadas à função em que são usadas
  • fácil mover funções ao redor do pacote

Contras:

  • Não foi possível ver em quais módulos este módulo pode depender

A primeira vez que você import goo de qualquer lugar (dentro ou fora de uma função), o goo.py (ou outro formato importável) é carregado e o sys.modules['goo'] é configurado para o objeto do módulo assim construído. Qualquer importação futura dentro da mesma execução do programa (novamente, seja dentro ou fora de uma função), basta procurar por sys.modules['goo'] e vinculá-lo ao nome de barra goo no escopo apropriado. A consulta de ditado e a vinculação de nomes são operações muito rápidas.

Supondo que a primeira import seja totalmente amortizada durante a execução do programa, ter o "escopo apropriado" no nível de módulo significa que cada uso de goo.this , goo.that , etc, é duas goo.this de goo.this - uma para goo e outra para o nome do atributo. Ter "nível de função" paga uma configuração extra de variável local por execução da função (ainda mais rápida que a parte de pesquisa de dicionário!), Mas salva uma consulta de dita (trocando por uma pesquisa de variável local, incrivelmente rápida) para cada goo.this (etc) o acesso, reduzindo pela metade o tempo que tais pesquisas levam.

Estamos falando de alguns nanossegundos de um jeito ou de outro, então não é uma otimização que vale a pena. A única vantagem substancial de ter a import dentro de uma função é quando essa função pode não ser necessária em uma determinada execução do programa, por exemplo, essa função lida com erros, anomalias e situações raras em geral; se for esse o caso, qualquer execução que não necessite da funcionalidade nem mesmo executará a importação (e isso é uma economia de microssegundos, não apenas nanossegundos), apenas as execuções que precisam da funcionalidade pagarão o preço (modesto mas mensurável).

Ainda é uma otimização que vale a pena em situações muito extremas, e há muitos outros que eu consideraria antes de tentar extrair microssegundos dessa maneira.


Ele reimporta toda vez que a função é executada?

Não; ou melhor, os módulos Python são essencialmente armazenados em cache toda vez que são importados, portanto, a importação de um segundo (ou terceiro, ou quarto ...) tempo não os força de fato a passar por todo o processo de importação novamente. 1

Importa uma vez no início se a função é executada ou não?

Não, só é importado se e quando a função for executada. 2 , 3

Quanto aos benefícios: depende, eu acho. Se você só pode executar uma função muito raramente e não precisa do módulo importado em outro lugar, pode ser benéfico importá-lo apenas nessa função. Ou, se houver um conflito de nomes ou outro motivo, você não quer que o módulo ou os símbolos do módulo estejam disponíveis em qualquer lugar , você pode querer importá-lo apenas em uma função específica. (Claro, sempre há do from my_module import my_function as f para esses casos.)

Na prática geral, provavelmente não é tão benéfico. Na verdade, a maioria dos guias de estilo do Python incentivam os programadores a colocar todas as importações no início do arquivo do módulo.


Posso sugerir, em geral, que, em vez de perguntar, "X melhorará meu desempenho?" você usa o perfil para determinar onde seu programa realmente está gastando seu tempo e, em seguida, aplica otimizações de acordo com o local onde você obterá o maior benefício?

E então você pode usar o perfil para garantir que suas otimizações também tenham beneficiado você.


Importar dentro de uma função efetivamente importará o módulo uma vez .. na primeira vez que a função for executada.

Ele deve importar com a mesma rapidez se você importá-lo no topo, ou quando a função é executada. Isso geralmente não é um bom motivo para importar em um def. Pros? Não será importado se a função não for chamada. Este é realmente um motivo razoável se o seu módulo requer apenas que o usuário tenha um certo módulo instalado se eles usarem funções específicas ...

Se não é por isso que você está fazendo isso, é quase certamente uma idéia nojenta.





python-import