Je travaille dans l'environnement Google App Moteur et la programmation à Python. Je crée une fonction qui génère essentiellement une chaîne de numéro / lettre aléatoire, puis rangée sur le memcache. crée deux fonctions au lieu d'une seule grosse affectement des performances? Je préfère deux, car cela correspondait mieux à la façon dont je pense, mais ça ne vous dérange pas de les combiner si c'est "la meilleure pratique". P> P>
4 Réponses :
Concentrez-vous sur la possibilité de lire et de comprendre facilement votre code. P>
Une fois que vous avez fait cela, si vous avez un problème de performance, puis examinez ce qui pourrait le causer. P>
La plupart des langues, python inclus, ont tendance à avoir des frais de tête assez bas pour faire des appels de méthode. Mettre ce code dans une seule fonction ne va pas (spectaculaire) modifier les paramètres de performance - je suppose que votre génération de nombres aléatoires sera probablement la majeure partie du temps, sans avoir 2 fonctions. p>
Cela étant dit, les fonctions de fractionnement ont un impact (très, très mineur) sur la performance. Cependant, j'y penserais de cette façon - cela peut vous amener à partir de 80 mph sur l'autoroute jusqu'à 79,99 mph (que vous ne remarquerez jamais vraiment). Les choses importantes à surveiller sont en évitant les feux d'arrêt et les embouteillages, car ils vont vous faire arrêter complètement ... P>
Vous n'avez pas mentionné que cette optimisation prématurée crée plus de problèmes que cela ne résout.
Je suis en désaccord avec votre déclaration que la plupart des langues, python incluses, ont tendance à avoir des frais de surcharge assez bas pour faire des appels de méthode. wiki.python.org/moin/pythonspeed/...
@Swiss: Cet exemple est très artificiel. Cela fait très peu de travail, dans une boucle serrée, qui est un pire des scénarios. Dans ce cas, le coût de la fonction de fonction sera probablement microscopique par rapport au coût de calcul du randonneur et le coût de stockage dans MemCache. Cela étant dit - les frais généraux d'un appel de la fonction dans Python sont encore petits, plus haut que certaines autres langues - dans l'ensemble, il est toujours un impact très mineur sur la perfection globale., À moins que votre fonction se produise de manière tritiquement petite de travail.
Reed a raison. Pour le changement que vous envisagez, le coût d'un appel de la fonction est un petit nombre de cycles, et vous devriez le faire 10 ^ 8 fois par seconde avant de noter. P>
Cependant, je voudrais dire que souvent les gens vont à l'autre extrême, puis il est comme si les appels de fonction em> étaient coûteux. J'ai vu cela dans des systèmes sur-conçus où il y avait beaucoup de couches d'abstraction. P>
Que se passe-t-il est qu'il y a une psychologie humaine qui dit si quelque chose est facile à appeler, alors c'est rapide. Cela conduit à écrire plus d'appels de fonction que strictement nécessaires, et lorsque cela se produit sur plusieurs couches d'abstraction, le gaspillage peut être exponentiel. P>
Exemple de conduite de Reed suivant, un appel de fonction peut être un détour, et si le détour contient des détoures, et si ceux-ci contiennent également des détours, il y a bientôt une période considérable en gaspillée, car aucun évident em> , parce que chaque appel de fonction semble innocent. P>
Dans presque tous les cas, «Inlinge» Les fonctions pour augmenter la vitesse sont comme obtenir une coupe de cheveux pour perdre du poids. P>
Comme les autres l'ont dit, je ne m'inquiéterais pas dans ce scénario particulier. La très petite surcharge impliquée dans les appels de fonction serait pâle par rapport à ce qui se fait à l'intérieur de chaque fonction. Et tant que ces fonctions ne sont pas appelées de succession rapide, cela n'aurait probablement pas beaucoup d'importance de toute façon. P>
C'est une bonne question cependant. Dans certains cas, il est préférable de ne pas casser du code dans plusieurs fonctions. Par exemple, lorsque vous travaillez avec des tâches intensives en maths avec des boucles imbriquées, il est préférable de faire quelques appels de fonction que possible dans la boucle interne. C'est parce que les simples opérations mathématiques elles-mêmes sont très bon marché et à côté de celle-ci, la fonction d'appels de fonction peut provoquer une pénalité de performance notable. P>
Il y a des années, j'ai découvert que la fonction Hypot (hypoténuse) dans la bibliothèque de mathématiques que j'utilisais dans une application VC ++ était très lente. Cela me semblait ridicule parce que c'est un tel ensemble de fonctionnalités - retour SQRT (A * A + B * B) - Quelle est la dure? J'ai donc écrit le mien et géré pour améliorer les performances 16 fois. Ensuite, j'ai ajouté le mot-clé "Inline" à la fonction et l'a effectué 3 fois plus rapidement que celui (environ 50 fois plus rapide à ce stade). Ensuite, j'ai pris le code de la fonction et je l'ai mis dans ma boucle elle-même et j'ai vu une autre augmentation de la faible performance. Alors ... Ouais, ce sont les types de scénarios où vous pouvez voir une différence. P>
Ne serait-il pas sqrt (un a + b i> b)?
Vous pouvez indenter avec 4 espaces pour le code à afficher correctement.