7
votes

Définition de la fonction dans une autre définition de fonction -Slow?

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()


1 commentaires

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.


4 Réponses :


7
votes

Utilisation de Python 2.6.5 sur Ubuntu 64 bits, il n'y a pas de différence discernable: xxx


0 commentaires

3
votes

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 myfunc .

Il pourrait y avoir une différence entre Les deux variantes si myfunc () 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.

Exemple exagéré: xxx

avec le code Daft ci-dessus, myClass.myfunc2 () reviendra immédiatement, tandis que myClass2.myfunc2 () prend une seconde pour exécuter.


3 commentaires

Je ne comprends pas bien pourquoi myClass2.myfunc2 () prend une seconde, mais myClass.myfunc2 () retourne immédiatement. Pourquoi la définition sera exécutée sur et surgian dans la deuxième variante, si myfunc () 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 () . La première variante exécute la définition de la fonction une seule fois.


Ensuite, je pense que myClass.myfunc2 () devrait prendre 1 seconde pour exécuter, et myClass2.myfunc2 () devrait prendre 2 secondes?



2
votes

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.


0 commentaires

0
votes

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. xxx pré> xxx pré>

10 boucles, meilleur de 10: 4,2 ms par boucle p> xxx pré> p> 10 boucles, meilleur de 10: 5.33 MS PAR LOOP P>

%%timeit -r 1 -n 1
x = 0.5
for i in xrange(1000000):
    x = f2(x)


0 commentaires