110 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """
 | |
| Module utilisé à l'UMONS dans le cadre des cours de Programmation et
 | |
| Algorithmique 1 et Structure de Données 1 pour faciliter le calcul
 | |
| des temps CPU.
 | |
| 
 | |
| Auteur: Pierre Hauweele et Hadrien Mélot (Université de Mons), 2016
 | |
| """
 | |
| 
 | |
| import timeit
 | |
| import pickle
 | |
| 
 | |
| 
 | |
| def __init_timer__(f, *args):
 | |
|     fs = pickle.dumps(f)
 | |
|     argss = pickle.dumps(args)
 | |
|     setup = \
 | |
| """
 | |
| import pickle
 | |
| import copy
 | |
| f = pickle.loads(%s)
 | |
| args = pickle.loads(%s)
 | |
| """ % (fs, argss)
 | |
|     stmt = 'f(*copy.deepcopy(args))'
 | |
|     return timeit.Timer(stmt, setup)
 | |
| 
 | |
| 
 | |
| def __calibrate__(t):
 | |
|     calibrate_test = 0
 | |
|     n = 1
 | |
| 
 | |
|     while calibrate_test < 0.1:
 | |
|         n *= 10
 | |
|         calibrate_test = t.timeit(n)
 | |
| 
 | |
|     return n, calibrate_test
 | |
| 
 | |
| 
 | |
| def cpu_time(f, *args):
 | |
|     """ Retourne un temps CPU exprimé en millisecondes (ms)
 | |
|             - f : fonction ou méthode à tester
 | |
|             - *args : liste d'arguments pour f. Ces arguments ne sont pas
 | |
|               modifiés, même si la fonction f a des effets de bord (ils sont
 | |
|               copiés avant l'exécution).
 | |
| 
 | |
|             Exemples :
 | |
|                 cputime(math.sqrt, 4)
 | |
|                    pour calculer le temps CPU de math.sqrt(4)
 | |
|                 cputime(str.upper, 'hello')
 | |
|                    pour calculer le temps CPU de 'hello'.upper()
 | |
|                 cputime(myfunc, x, y, z)
 | |
|                    pour calculer le temps CPU de myfunc(x, y, z)
 | |
|     """
 | |
|     t = __init_timer__(f, *args)
 | |
| 
 | |
|     n, cal_time = __calibrate__(t)
 | |
| 
 | |
|     res = min([cal_time] + t.repeat(2, n))
 | |
| 
 | |
|     return (res / n) * 1000
 | |
| 
 | |
| 
 | |
| def calibrate(f, *args):
 | |
|     """ Retourne un nombre de tests qui rend le calcul du temps CPU
 | |
|         a priori raisonnable.
 | |
|             - f : fonction ou méthode à tester
 | |
|             - *args : liste d'arguments pour f. Ces arguments ne sont pas
 | |
|               modifiés, même si la fonction f a des effets de bord (ils sont
 | |
|               copiés avant l'exécution).
 | |
| 
 | |
|         Le nombre de tests retourné est une puissance de 10 (au minimum 10). Il
 | |
|         sera d'autant plus grand si la fonction semble rapide.
 | |
|     """
 | |
|     t = __init_timer__(f, *args)
 | |
| 
 | |
|     n, cal_time = __calibrate__(t)
 | |
| 
 | |
|     return n
 | |
| 
 | |
| 
 | |
| def cpu_time_without_copy(f, *args):
 | |
|     """ Retourne un temps CPU exprimé en millisecondes (ms)
 | |
|             - f : fonction ou méthode à tester
 | |
|             - *args : liste d'arguments pour f.
 | |
|             Cette version ne copie pas les arguments:
 | |
|             il ne faut donc l'utiliser qu'avec des fonctions
 | |
|             sans effet de bord !
 | |
|     """
 | |
|     fs = pickle.dumps(f)
 | |
|     argss = pickle.dumps(args)
 | |
|     setup = \
 | |
| """
 | |
| import pickle
 | |
| f = pickle.loads(%s)
 | |
| args = pickle.loads(%s)
 | |
| """ % (fs, argss)
 | |
|     stmt = 'f(*args)'
 | |
|     t = timeit.Timer(stmt, setup)
 | |
| 
 | |
|     calibrate_test = 0
 | |
|     n = 1
 | |
| 
 | |
|     while calibrate_test < 0.1:
 | |
|         n *= 10
 | |
|         calibrate_test = t.timeit(n)
 | |
| 
 | |
|     res = min([calibrate_test] + t.repeat(2, n))
 | |
| 
 | |
|     return (res / n) * 1000
 | |
| 
 |