2008-11-17 8 views
4

Je m'excuse d'avance si cette question semble corrective.Qu'est-ce qui est le plus efficace en Python: les importations standard ou les importations contextuelles?

ce qui serait considéré comme plus efficace en Python:

Importation standard

import logging 

try: 
    ...some code... 
exception Exception, e: 
    logging.error(e) 

... ou ...

importation contextuelle

try: 
    ...some code... 
exception Exception, e: 
    import logging 
    logging.error(e) 
+1

Je ne suis pas sûr que l'efficacité de vos importations est vraiment là où vous devriez passer votre temps de performance. Si vous avez un module individuel qui ralentit vraiment votre temps de démarrage, pensez à le refactoriser pour qu'il fasse ses calculs à la demande au lieu de le faire au moment du chargement. –

+0

Je n'ai jamais dit que cela causait un ralentissement. J'étais juste curieux du consensus sur le sujet. – Huuuze

Répondre

6

Les importations contextuelles sont techniquement plus efficaces, mais je pense qu'elles peuvent créer d'autres problèmes. Par la suite, si vous souhaitez ajouter une clause except similaire, vous disposez désormais de deux emplacements pour conserver le même bloc de code. Vous avez également le problème de tester l'exception, pour vous assurer que la première importation ne provoque pas de problèmes imprévus dans votre code.

+2

Ils sont seulement plus efficaces s'ils sont utilisés rarement ou jamais. –

+0

Certes, je faisais l'hypothèse que l'importation se produirait rarement, sinon il n'y aurait pas vraiment de point. Les importations conditionnelles, comme vous l'avez souligné, peuvent être une meilleure idée et sont très courantes, en particulier lorsque vous manipulez plusieurs versions de bibliothèques. – JimB

2

Ils sont essentiellement les mêmes. L'interpréteur Python chargera seulement un module utilisé une fois, peu importe le nombre de fois que vous l'importez. La modification de l'emplacement de l'instruction d'importation n'a d'effet que sur l'endroit où le nom est lié. Par exemple, si votre instruction import se trouve dans une fonction, le nom ne peut être utilisé que dans cette fonction. En règle générale, cependant, les importations sont généralement effectuées aussi près que possible du «sommet» d'un fichier.

+0

Bien que dans l'exemple donné, la différence pour l'importation contextuelle est que le module est chargé uniquement si l'exception se produit. –

3

Cela dépend de la fréquence à laquelle vous exécutez l'importation contextuelle.

Une instruction import nécessite une vérification pour voir si le module existe, ce qui a un coût non nul.

Un grand nombre d'importations contextuelles sera une pénalité de performance sans réel gain de simplicité. Il y a très peu d'avantages, sauf si vous êtes vraiment sûr que l'importation sera rarement ou jamais utilisée.

Les importations contextuelles à l'intérieur de if sont logiques, en particulier lorsqu'elles sont effectuées au niveau supérieur, ce qui signifie une seule fois.

if someConfig: 
    import this as bigDeal 
else: 
    import that as bigDeal 
3

Ceci est une micro-optimisation. Ne t'en fais pas pour ça.

+0

Je voudrais ajouter un peu sur l'optimisation seulement après le profilage. (Sinon, réponse parfaite) –

1

Les différences de performance entre ces deux approches seront très faibles en pratique. Je n'ai jamais vu un cas où cela a fait une différence qui était perceptible.

Rappelons que l'interpréteur python ne fera jamais qu'une seule fois l'analyse du module lorsqu'il sera importé.

En général, vous obtiendrez un code plus maintenable, il vous suffit d'importer tous les modules dont vous avez besoin en haut du fichier.

Questions connexes