219 votes

En python, ce qui se passe lorsque vous importez à l'intérieur d'une fonction?

Je me demande ce que les avantages et les inconvénients de l'importation d'un module python et/ou de la fonction à l'intérieur de la fonction. Est-il ré-importer à chaque fois que la fonction est exécutée? Est-il importer une seule fois au début de savoir si ou non l'exécution de la fonction?

De toute façon je vous serais reconnaissant les avantages et les Inconvénients de l'importation à l'intérieur d'une fonction, plus précisément sur l'efficacité de la vitesse de plus de mémoire.

202voto

mipadi Points 135410

Est-il ré-importer à chaque fois que la fonction est exécutée?

Pas; ou plutôt, les modules Python sont essentiellement mis en cache à chaque fois qu'ils sont importés, de sorte que l'importation d'un deuxième (ou troisième, ou quatrième...) en temps ne fait pas les forcer à aller à travers l'ensemble du processus d'importation de nouveau.

Est-il importer une seule fois au début de savoir si ou non l'exécution de la fonction?

Non, il n'est importée si et lorsque la fonction est exécutée.

Comme pour les avantages: ça dépend, je suppose. Si vous ne pouvez exécuter une fonction très rarement et n'ont pas besoin du module importé n'importe où ailleurs, il peut être bénéfique uniquement pour importer dans cette fonction. Ou si il y a un conflit de nom ou une autre raison, vous ne voulez pas le module ou des symboles à partir du module disponible partout, vous ne voulez importer dans une fonction spécifique. (Bien sûr, il y a toujours from my_module import my_function as f de ces cas.)

Dans la pratique, il n'est probablement pas utile. En fait, la plupart Python guides de style encourager les programmeurs de placer toutes les importations au début du fichier de module.

55voto

Alex Martelli Points 330805

La première fois que vous import goo à partir de n'importe où (à l'intérieur ou à l'extérieur d'une fonction), goo.py (ou d'autres importables forme) est chargé et sys.modules['goo'] est définie dans le module objet ainsi construit. Toute importation future au sein de la même exécution du programme (encore une fois, que ce soit à l'intérieur ou à l'extérieur d'une fonction) il suffit de regarder jusqu' sys.modules['goo'] et le lier à barename goo dans le champ d'application approprié. Le dict de recherche et le nom de liaison sont très rapide des opérations.

En supposant que le premier import devient totalement amortis sur le programme d'exécution de toute façon, avoir la "portée" être au niveau du module signifie que chaque utilisation d' goo.this, goo.that, etc, est de deux dict recherches -- un pour goo et une pour le nom de l'attribut. Être de "niveau de la fonction" paie un supplément local-réglage variable par exécution de la fonction (même plus rapide que la recherche dans le dictionnaire!) mais la sauvegarde d'un dict de recherche (échanger pour un local de la variable de recherche, hyper rapide) pour chaque goo.this (etc) l'accès, essentiellement à réduire de moitié le temps de ces recherches prennent.

Nous parlons de quelques nanosecondes d'une manière ou d'une autre, il n'est donc pas la peine d'optimisation. Le seul potentiellement considérable avantage d'avoir l' import à l'intérieur d'une fonction est lorsque cette fonction peut ne pas être nécessaire à tous dans une exécution du programme, par exemple, que la fonction traite avec des erreurs, des anomalies, et de rares situations, en général; si c'est le cas, une course qui n'a pas besoin de la fonctionnalité ne sera pas à même de réaliser l'importation (et c'est une économie de microsecondes, et pas seulement nanosecondes), ne fonctionne que avez besoin de la fonctionnalité de payer le (modeste mais mesurable) des prix.

C'est encore une optimisation qui est seulement utile dans de jolies situations extrêmes, et il y a beaucoup d'autres que je considère avant d'essayer de faire sortir microsecondes de cette façon.

20voto

SilentGhost Points 79627

Il importe, une fois lorsque la fonction s'exécute en premier temps.

Pour:

  • les importations liées à la fonction qu'ils sont utilisés dans des
  • facile à déplacer grâce à des fonctions autour de l'emballage

Inconvénients:

  • ne pouvait pas voir ce que les modules ce module peut dépendre

8voto

gomad Points 794

Pourrais-je vous suggérer que, en général, au lieu de se demander, "X améliorer ma performance?", vous utilisez le profilage afin de déterminer l'emplacement de votre programme est en fait de dépenser son temps et ensuite appliquer des optimisations en fonction de où vous aurez le plus d'avantages?

Et puis, vous pouvez utiliser le profilage de s'assurer que votre optimisations ont effectivement bénéficié de vous, trop.

7voto

royal Points 332

L'importation à l'intérieur d'une fonction efficacement importer le module une fois.. la première fois que la fonction est exécutée.

Il doit importer tout aussi vite que vous l'importer en haut, ou lorsque la fonction est exécutée. Ce n'est généralement pas une bonne raison de les importer dans un def. Pros? Il ne sera pas importé si la fonction n'est pas appelée.. C'est en fait un motif raisonnable, si votre module ne nécessite que les utilisateurs disposent d'un certain module installé si ils utilisent des fonctions spécifiques de la vôtre...

Si c'est non, il a raison, vous êtes en train de faire cela, c'est presque certainement une sale idée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X