Comment utiliser python timeit lors du passage de variables, de fonctions?
J'ai du mal avec cela à l'aide de timeit et je me demandais si quelqu'un a des conseils
Fondamentalement, j'ai une fonction(que je passe une valeur) que je veux tester la vitesse de la et créé ce:
if __name__=='__main__':
from timeit import Timer
t = Timer(superMegaIntenseFunction(10))
print t.timeit(number=1)
mais quand je le lance, j'obtiens des erreurs étranges comme provenant du module timeit.:
ValueError: stmt is neither a string nor callable
Si j'exécute la fonction sur son propre, il fonctionne très bien. Son quand je l'envelopper dans le temps de ce module, j'obtiens les erreurs(j'ai essayé d'utiliser des guillemets et sans..sameoutput).
toute suggestion serait génial!
Merci!
Vous devez vous connecter pour publier un commentaire.
Faire un callable:
Devrait fonctionner
timeit 5*5
est de 33 ns, tandis quetimeit (lambda: 5*5)()
est 233 ns.timeit
avec le lambda (le script gelé; la méthode que j'ai a été de mesurer le temps d'exécution est leretrbinary
pour téléchargement via FTP à l'aide duftplib
). Une fois que j'ai utilisé leTimer
objet soudain, elle a travaillé comme un charme. Aucune idée de ce qui s'est passé... 😀Timer(superMegaIntenseFunction(10))
signifie "appelersuperMegaIntenseFunction(10)
, puis de passer le résultat àTimer
". C'est clairement pas ce que vous voulez.Timer
attend un callable (juste comme il sonne: quelque chose qui peut être appelé, comme une fonction), ou une chaîne de caractères (de sorte qu'il peut interpréter le contenu de la chaîne, comme le code Python).Timer
fonctionne en appelant le callable-chose à plusieurs reprises et de voir comment beaucoup de temps est pris.Timer(superMegaIntenseFunction)
serait de passer la vérification de type, parce quesuperMegaIntenseFunction
est appelable. Cependant,Timer
ne sais pas quelles sont les valeurs à transmettre àsuperMegaIntenseFunction
.La manière la plus simple de contourner cela, bien sûr, est d'utiliser une chaîne de caractères avec le code. Nous avons besoin de passer de l'un 'setup' argument pour le code, parce que la chaîne est "interprété comme du code", dans un nouveau contexte - il n'a pas accès à la même
globals
, vous devez exécuter un autre morceau de code pour rendre la définition disponibles - voir @oxtopus de réponse.Avec
lambda
(comme dans @Pablo de réponse), on peut lier le paramètre10
à un appel àsuperMegaIntenseFunction
. Tout ce que nous faisons est de créer une autre fonction, qui ne prend pas d'arguments, et les appelssuperMegaIntenseFunction
avec10
. C'est juste que si vous aviez utilisédef
pour créer une autre fonction comme ça, sauf que la nouvelle fonction n'est pas d'obtenir un nom (car il n'en a pas besoin).Vous devriez être en train de passer une chaîne de caractères. c'est à dire
Une note pour les futurs visiteurs. Si vous avez besoin pour le faire fonctionner dans
pdb
débogueur, etsuperMegaIntenseFunction
n'est pas dans la portée globale, vous pouvez le faire fonctionner par l'ajout, àglobals
:Une façon de le faire serait par l'utilisation partielle de sorte que la fonction, 'superMegaIntenseFunction" est utilisé comme un callable (c'est à dire sans les ()) dans la minuterie ou directement à l'intérieur de timeit.timeit. À l'aide partielle va passer l'argument de la fonction quand il sera en appel par la minuterie.