4

Dans un framework tel que Django, j'imagine que si un utilisateur atterrit sur une page (exécutant une fonction de vue appelée "some_page"), et que vous avez 8 imports en haut du module qui ne sont pas pertinents pour cette vue, 'gaspiller des cycles sur ces importations. Mes questions sont:Python - optimiser en n'important pas au niveau du module?

  1. Est-ce une quantité suffisante de ressources pour avoir un impact sur un site Web à fort trafic?
  2. Est-ce une mauvaise pratique d'importer à l'intérieur d'une fonction à cet effet qu'il faut éviter à cet impact?

Remarque: Cela peut être considéré comme une optimisation prématurée, mais cet argument ne m'intéresse pas. Supposons, pour des raisons pratiques, qu'il s'agit d'un site complet avec beaucoup de trafic, qui doit être optimisé de toutes les manières possibles, et que le code de l'application ainsi que la base de données ont été entièrement optimisés par 50 administrateurs et développeurs de bases de données. et ces importations sont la seule chose qui reste.

+0

Sans les données de profilage, il s'agit d'une optimisation prématurée. S'il vous plaît, s'il vous plaît, s'il vous plaît, obtenez des données de profil avant de poser des questions hypothétiques comme celle-ci. S'il vous plaît obtenir des données de profilage afin que vous puissiez voir le coût réel de ces deux modèles. S'il vous plaît. Obtenir. Les données. –

+0

Pour ceux qui trébuchent dans cette question: http://wiki.python.org/moin/PythonSpeed/PerformanceTips#ImportStatementOverhead – orokusaki

+0

Veuillez noter que l'hypothèse: "l'utilisateur atterrit sur une page (exécutant une fonction de vue appelée" some_page "), et vous avez 8 importations en haut du module qui ne sont pas pertinentes pour cette vue, vous gaspillez des cycles sur ces importations "Est faux. Le module n'est pas ** rechargé de zéro pour chaque page desservie. Trébucher sur cette question conduira à une confusion inutile, puisque l'hypothèse est fausse. –

Répondre

15

Non, ne faites pas cela. Dans un environnement d'exécution Python normal sur le Web (mod_wsgi, gunicorn, etc.) lorsque votre processus démarre, ces importations seront exécutées, puis toutes les requêtes suivantes ne ré-exécuteront pas le script. Si vous placez les importations dans les fonctions, elles devront être traitées chaque fois que la fonction est appelée.

4

1) La réponse est non. Django/Python n'est pas comme PHP. Votre module entier ne sera pas réinterprété avec chaque page vue comme arrive avec PHP inclut. Le module sera en mémoire et chaque page affichera un appel de fonction simple à votre vue.

2) Oui, ce sera une contre-optimisation pour faire des importations au niveau de la vue.

5

Oui, c'est une mauvaise pratique d'importer au niveau de la fonction. En utilisant des importations plus intelligentes en haut du module, vous créez une fois, petit coût. Cependant, si vous placez une importation dans une fonction, vous subirez le coût de l'importation chaque fois que cette fonction est exécutée. Donc, plutôt que d'importer dans la fonction, il suffit d'importer en haut du module.

Quelques choses que vous pouvez faire pour nettoyer et améliorer vos importations:

  • Ne pas utiliser la importations sauvages par exemple from x import *
  • Si possible, utilisez simplement une importation normale, par ex. import x
  • Essayez de diviser votre code en petits modules qui peuvent être appelés séparément, de sorte que moins les importations sont faites

En outre, en plaçant les importations en haut du module est une question de style. Il y a une raison pour laquelle PEP 8 dit que les modules doivent être importés au sommet. C'est beaucoup plus lisible et maintenable de cette façon.

Enfin, certaines importations au niveau de la fonction entraîneront des problèmes de compatibilité à l'avenir, car from x import * n'est pas valide Python 3.x au niveau de la fonction.

+0

intéressant, je n'étais pas au courant de ce changement dans Python 3k. Merci. – orokusaki

1
  1. Non. Même raison que les autres réponses.

  2. Oui. Même raison que les autres réponses.

BTW, vous pouvez également importer paresseusement. Par exemple, Importing toolkit peut "importer" un module dans le code de niveau supérieur, mais le module n'est pas réellement chargé tant que l'un des attributs n'est pas accédé.

0

-plaque de la chaudière suivant Parfois est logique:

foo = None 

def foorify(): 
    global foo 
    if not foo: from xxx import foo 

    foo.bar() 

Cela est logique si foorification est conditionnelle à quelque chose qui change rarement, par exemple un serveur se foorifie alors qu'un autre ne le fait jamais ou si vous ne voulez pas ou ne pouvez pas importer foo en toute sécurité pendant le démarrage de l'application ou la plupart des tests.

Questions connexes