Regardez à deux façons de structurer mes fonctions:
class myClass: def _myFunc(self): pass def myFunc2(self): self._myFunc() class myClass: def myFunc2(self): def myFunc(): pass myFunc()
4 Réponses :
Utilisation de Python 2.6.5 sur Ubuntu 64 bits, il n'y a pas de différence discernable:
La fonction locale dans la deuxième variante ne sera pas compilée encore et encore - elle est compilée une fois avec l'ensemble du fichier et son corps est stocké dans un objet de code. La seule chose qui se produit pendant l'exécution de la fonction extérieure est que l'objet de code est enveloppé dans un nouvel objet de fonction qui est ensuite lié au nom local Il pourrait y avoir une différence entre Les deux variantes si Exemple exagéré: p> avec le code Daft ci-dessus, myfunc code>.
myfunc () code> prend des paramètres par défaut. Leur définition serait à nouveau exécutée dans la deuxième variante, ce qui entraînerait une éventuelle de performances. P>
myClass.myfunc2 () code> reviendra immédiatement, tandis que
myClass2.myfunc2 () code> prend une seconde pour exécuter. p> p>
Je ne comprends pas bien pourquoi myClass2.myfunc2 () code> prend une seconde, mais
myClass.myfunc2 () code> retourne immédiatement. Pourquoi la définition sera exécutée sur et surgian dans la deuxième variante, si
myfunc () code> prend des paramètres par défaut?
@Alcott: L'argument par défaut est évalué au moment de la définition de la fonction exécutée. La deuxième variante exécute la fonction de fonction de fonction et encore une fois, car il est à l'intérieur my_func2 () code>. La première variante exécute la définition de la fonction une seule fois.
Ensuite, je pense que myClass.myfunc2 () code> devrait prendre 1 seconde pour exécuter, et
myClass2.myfunc2 () code> devrait prendre 2 secondes?
Recherche en pointillé (A.K.A. La liaison d'attributs) prend toujours plus de temps que les recherches de la portée imbriquée. Le premier implique un dictionnaire de la série de recherches et de création d'un nouvel objet (une méthode liée ou non liée). Ce dernier utilise des variables cellulaires et sont implémentées à l'aide d'une recherche de tableau. P>
Malgré les autres réponses qui prétendent qu'il n'y a aucun effet, je pensais que je devrais vérifier.
J'ai trouvé un avantage très certain de définir la fonction à l'extérieur. 10 boucles, meilleur de 10: 4,2 ms par boucle p> %%timeit -r 1 -n 1
x = 0.5
for i in xrange(1000000):
x = f2(x)
La seule différence que je peux penser est de faire quelque chose à voir avec les variables mondiales et, étant donné que le tout est enveloppé dans une classe qui n'est pas un problème.