Code source de timetime

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fileencoding=utf-8

import time
import re


[docs]class TimeTime: """ TimeTime est une classe qui permet d'afficher le temps d'exécution de fonctions, également de les comparer entre eux. TimTime retourne le temps d'exécution total pour <loops> boucles (par défaut 10000) et le temps moyen par boucle. TimeTime est simple à utiliser. Il est basé sur les modules built-in time et re. """ # Special class methods, used in setup.py
[docs] def version(cls): """ Retourne la version de la classe. Attention, le numero de version du setup.py est extrait d'ici. """ print("Version 1.0")
version = classmethod(version) # class attributes loops = 10000
[docs] def get_loops(cls): """ Retourne le nombre de boucles. Défaut = 10000 C'est un attribut de classe car ça n'aurait pas de sens de comparer 2 objets TimeTime n'ayant pas le même nombre de loops. """ return cls.loops
get_loops = classmethod(get_loops)
[docs] def set_loops(cls, loops): """ Modifie le nombre de boucles. Défaut = 10000 C'est un attribut de classe car ça n'aurait pas de sens de comparer 2 objets TimeTime n'ayant pas le même nombre de loops. """ cls.loops = loops
set_loops = classmethod(set_loops) # Constructeur def __init__(self, function): """ Constructeur Le constructeur préserve la fonction et extrait son nom pour futur affichage. """ self.function = function self.fname = self._function_name(function) # self.loops = 10000 # Class methods
[docs] def demo(cls): """Lance une demo de la classe""" from timetime_demo import demo demo()
demo = classmethod(demo) # private methods def _function_name(self, function): """Return le nom de la fonction""" p = re.compile(r'(?:[a-zA-Z0-9_])*', re.UNICODE) f = re.findall(p, str(function)) f = f[3] return f + "()" def _stats(self, fin): """Formmate et retourne une chaine de statistique pour la fonction, comprenant les temps d'exécution total et moyen""" stats = "" stats += ("-"*42 + "\n") stats += self.fname + ", " + str(self.loops) +\ " loops.\n" stats += "Total runtime = " + str(fin) + "\n" stats += "Mean loop = " + str(fin/self.loops) stats += ("\n" + "-"*42) return stats # public methods
[docs] def compute_time(self): """Retourne le temps totel d'exécution d'une fonction.""" start = time.time() for i in range(self.loops): self.function() fin = time.time() - start return fin
# other public methods (overloading)
[docs] def __str__(self): """Retourne une chaine de statistique pour la fonction, comprenant les temps d'exécution total et moyen""" timef = self.compute_time() return self._stats(timef)
[docs] def __eq__(self, other): """ 2 temps d'exécution égaux sont hautement improbables. On se sert donc de l'opérateur == pour retourner une chaine de statistique pour chacune des fonctions à comparer. Les chaines comprenent chacune les temps d'exécution total et moyen pour chaque fonction. .. note:: Exemple d'usage: print(f1 < f2) """ retour = "\n" retour += self.fname + " == " + other.fname + "\n" retour += self.__str__() + "\n" retour += other.__str__() return retour
[docs] def __lt__(self, other): """ Retourne: - nom f1 < nom f2 - Total runtime f1 < total runtime f2 - FALSE or TRUE. Nombre de boucles .. note:: Exemple d'usage: print(f1 < f2) """ retour = "" retour += ("-"*42 + "\n") retour += self.fname + " < " + other.fname + ", " + str(self.loops) +\ " loops.\n" objet1 = self.compute_time() objet2 = other.compute_time() retour += str(objet1) + " < " + str(objet2) + "\n" retour += "TRUE" if objet1 < objet2 else "FALSE" retour += ". Times are total runtimes." retour += ("\n" + "-"*42) return retour
[docs] def __gt__(self, other): """ Retourne: - nom f1 > nom f2 - Total runtime f1 > total runtime f2 - FALSE or TRUE. Nombre de boucles .. note:: Exemple d'usage: print(f1 > f2) """ retour = "" retour += ("-"*42 + "\n") retour += self.fname + " > " + other.fname + ", " + str(self.loops) +\ " loops.\n" objet1 = self.compute_time() objet2 = other.compute_time() retour += str(objet1) + " > " + str(objet2) + "\n" retour += "TRUE" if objet1 > objet2 else "FALSE" retour += ". Times are total runtimes." retour += ("\n" + "-"*42) return retour