Le moment précis de fonctions en python
Je suis à la programmation en python sur windows et souhaitez mesurer avec précision le temps qu'il faut pour une fonction à exécuter. J'ai écrit une fonction "time_it" qui prend une autre fonction, l'exécute et renvoie le temps qu'il a fallu pour exécuter.
def time_it(f, *args):
start = time.clock()
f(*args)
return (time.clock() - start)*1000
j'appelle ça 1000 fois et la moyenne du résultat. (les 1000 constante à la fin est de donner la réponse en millisecondes.)
Cette fonction semble fonctionner mais j'ai ce sentiment tenace que je suis en train de faire quelque chose de mal, et qu'en le faisant de cette façon, je suis en utilisant plus de temps que la fonction utilise lors de son exécution.
Est-il une norme plus ou accepté pour ce faire?
Quand j'ai changé mon test de la fonction à appeler un imprimer de sorte qu'il dure plus longtemps, mon time_it fonction retourne une moyenne de 2,5 ms tandis que le cProfile.run('f()') retourne et la moyenne de 7.0 ms. J'ai pensé que ma fonction serait surestimer le temps si quoi que ce soit, ce qui se passe ici?
Une remarque supplémentaire, c'est le temps relatif de fonctions par rapport à l'autre que je me soucie, pas le temps absolu comme ce sera évidemment varier selon le matériel et d'autres facteurs.
Vous devez vous connecter pour publier un commentaire.
Au lieu d'écrire votre propre code de profilage, je vous suggère de vérifier le Python intégrée profileurs (
profile
oucProfile
, selon vos besoins): http://docs.python.org/library/profile.htmlUtiliser le
timeit
module de l'Python standard library.D'utilisation de base:
Vous pouvez créer un "timeme" décorateur, comme si
Ce code est très imprécis
Ce code est moins inexactes
La très imprécis souffre d'un biais de mesure si le moment de l'exécution de la fonction est proche de l'exactitude de l'horloge. La plupart du temps mesurés sont simplement des nombres aléatoires entre 0 et quelques tops de l'horloge.
En fonction de votre charge de travail du système, le "temps" vous observer à partir d'une seule fonction peut être tout à fait un artefact de l'OS de la planification et d'autres incontrôlable frais généraux.
La deuxième version (moins inexacte) a moins d'un biais de mesure. Si votre fonction est vraiment rapide, vous devrez peut-être exécuter à 10 000 fois à l'humidité, hors de l'OS de la planification et d'autres frais généraux.
Les deux sont, bien sûr, terriblement trompeuse. Le temps d'exécution de votre programme, dans son ensemble, n'est pas la somme de la fonction d'exécution de fois. Vous ne pouvez utiliser les numéros relative des comparaisons. Ils ne sont pas des mesures absolues qui véhiculent beaucoup de sens.
time
est le temps moyen qu'il faut pour exécuter la fonction une fois.Si vous voulez le temps d'un python méthode, même si vous bloquer mesure pourrait lancer, une bonne approche est d'utiliser
with
déclaration. Définir quelquesTimer
classe commeAlors vous voudrez peut de temps un mode de connexion qui peut jeter. Utilisation
__exit()__
méthode sera appelée, même si la demande de connexion thows. Plus précisément, vous aurez vous utiliseztry
finally
pour voir le résultat dans le cas où il jette, comme avecPlus de détails ici.
C'est plus lisible
time.sleep(10)
seulement pris en 0.002 secondes pour s'exécuter en fonction de ce code. (btw, une grande différence entretime.clock()
ettime.time()
en python)Similaire à @AlexMartelli la réponse de
peut faire l'affaire.