7
votes

Python - Timeiting dans une classe

J'ai des problèmes réels avec la synchronisation d'une fonction d'une classe d'une classe. Je ne suis pas sûr que j'en revienne la bonne façon (jamais utilisé le temps imparti auparavant) et j'ai essayé quelques variations de la deuxième argumentation importante, mais pas de chance. Voici un exemple idiot de ce que je fais:

Traceback (most recent call last):
  File "timeItTest.py", line 9, in __init__
    t.timeit()
  File "C:\Python26\lib\timeit.py", line 193, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
    self.square(self.x, self.y)
NameError: global name 'self' is not defined


2 commentaires

Avez-vous une raison spécifique pour laquelle vous souhaitez utiliser TimeIt dans le Init de la classe? Vous devriez juste faire le temps de cette fonction d'appel de "extérieur": t = TimeIt.ticar ("mytimedClass.square (x, y)") BTW "MytimedClass" n'est pas un nom inspiré, car c'est une instance de scriptclass, pas une classer.


Dans mon vrai programme, j'ai besoin de lire un tas de données d'un fichier externe pour configurer l'objet. Le code de lecture que j'ai séparé de la fonction init à une autre fonction au cas où je devrais mettre à jour l'objet à nouveau ultérieurement. Depuis que je gère un tas d'instances et qu'ils font leur propre chargement de fichiers, je le souhaite que tous les temps eux-mêmes. Dans le simple exemple, j'ai posté ci-dessus, bien sûr, je pouvais le faire de l'extérieur, mais cela n'aide pas à mon vrai projet.


4 Réponses :


10
votes

Si vous êtes prêt à envisager des alternatives à TimeIt code>, j'ai récemment trouvé le BOTEWATCH Utilitaire de minuterie qui pourrait être utile dans votre cas. C'est vraiment simple et intuitif aussi:

import stopwatch

class TimedClass():

    def __init__(self):
        t = stopwatch.Timer()
        # do stuff here
        t.stop()
        print t.elapsed


1 commentaires

Beaucoup plus simple que de déterminer fois sur . Python a eu une bonne ventilation de toutes les propriétés de Timeit , mais l'explication et les exemples de la manière de l'utiliser pour le code de profil sont déroutant.



9
votes

Pourquoi voulez-vous que le timing à l'intérieur de la classe soit chronométré? Si vous prenez le timing de la classe, vous pouvez simplement transmettre une référence. IE

def __init__(self, ..):
    def timewrapper():
        return self.multiply(self.x, self.y)

    timeit.Timer(timewrapper)


1 commentaires

Réponse complète. Je vais regarder en utilisant le temps d'expiration. Merci!



0
votes

(Postage comme une réponse parce que le marquage de code ne fonctionne pas dans un commentaire)

J'ajouterais un essai / enfin de fermeture pour une sécurité supplémentaire: P>

class TimedClass():
  def __init__(self):
    t = stopwatch.Timer()
    try:
      # do stuff here, you can even use return "foo" here and throw exceptions
    finally:
      t.stop()
      print t.elapsed


0 commentaires

6
votes

Pour résoudre votre erreur initiale, vous pouvez utiliser TimeIt dans une classe avec des paramètres tels que celui-ci:

 t = timeit.Timer(lambda: self.square(self.x, self.y)).timeit()


0 commentaires