comment passer des paramètres d'une fonction lors de l'utilisation de timeit.Timer()
C'est le contour d'un programme simple
# some pre-defined constants
A = 1
B = 2
# function that does something critical
def foo(num1, num2):
# do something
# main program.... do something to A and B
for i in range(20):
# do something to A and B
# and update A and B during each iteration
import timeit
t = timeit.Timer(stmt="foo(num1,num2)")
print t.timeit(5)
- Je continuer à recevoir "nom global foo n'est pas défini".....
Quelqu'un peut-il m'aider sur ce point? Merci!
- Tout d'abord, la mise en retrait ici est source de confusion. Il ressemble à
foo
est définie dans un autre champ quet
... - salut. je fixe l'indentation. c'est un peu mieux maintenant? :] merci.
- timeit est ok pour les one-liners mais pour rien d'autre de mieux vérifier cette méthode stackoverflow.com/questions/5478351/...
- Il y a une solution très simple pour ce en python3, il vous suffit d'exécuter l'expression dans l'espace de noms global en ajoutant le
globals=globals()
paramètre à la timeit appel: stackoverflow.com/a/51913199/2925963
Vous devez vous connecter pour publier un commentaire.
Les extraits de code doit être autonome - ils ne peuvent pas faire de références externes. Vous devez définir vos valeurs dans la déclaration de chaîne ou d'installation de la chaîne:
Mieux encore, de réécrire votre code pour ne pas utiliser de valeurs globales.
Les fonctions peuvent utiliser des arguments en
timeit
si ceux-ci sont créés en utilisant les fermetures, nous pouvons ajouter ces comportements en les enveloppant dans une autre fonction.ou plus court, on peut utiliser functools.partielle plutôt explicite fermetures déclaration
ValueError: stmt is neither a string nor callable
(Python 3.6). Ma fonction fonctionne normalement sans timeit.timeit.timeit()
il a besoin d'être nourri votre fonction comme une chaîne de caractères par exempletimeit.timeit('foo')
Timer
; cela fonctionne aussi:timeit.timeit(functools.partial(foo, A, B), number=5)
En supposant que votre nom de fichier module est test.py
Votre fonction doit être définie dans la configuration de la chaîne. Une bonne façon de le faire est par la mise en place de votre code dans un module simple de sorte que vous avez à faire
Sinon, vous aurez à définir l'ensemble de l'installation d'une chaîne à l'intérieur de l'installation de déclaration.
Quelque chose de génial, je viens de découvrir sur est un raccourci pour iPython qui utilise cProfile.
J'ai l'habitude de créer une fonction supplémentaire:
v1
etv2
sont globales. Si elles sont locales à la fonction f ne fonctionne pasVoici un exemple de la façon de compartimenter le calendrier de routine, sans appel globals
On pourrait même généraliser cette option si vous voulez utiliser la même
timeit
fonction du temps d'autres fonctions. Voici un exemple avec votre exemplemain()
routine:Il y a une solution beaucoup plus simple (du moins pour Python 3), vous pouvez provoquer l'exécution de code à l'intérieur de votre espace de noms global:
t = timeit.Timer(stmt="foo(num1,num2)", globals=globals())
https://docs.python.org/3/library/timeit.html#examples
Je sais globals ne sont pas privilégiées, mais si vous êtes juste faire un rapide script pour vérifier quelque chose, je pense que c'est la méthode la plus simple de mise en œuvre.
Je préfère la création d'un
static
de classe avec toutes les Données prêtes à être récupérées avant de l'exécution de la minuterie.Cela devrait fonctionner:
J'ai été jouer avec le timing en Python 3.7 aujourd'hui et essayer de passer de variables et de fonctions dans la minuterie. C'est ce que je suis venu avec.
Ce sorties:
Tout ce qu'il faut pour tester une nouvelle version est l'ajout d'une nouvelle fonction. Quelque chose comme:
Maintenant, c'sorties: