.
This commit is contained in:
109
bac1/q1/17nov/umons_cpu.py
Normal file
109
bac1/q1/17nov/umons_cpu.py
Normal file
@ -0,0 +1,109 @@
|
||||
"""
|
||||
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
|
||||
|
Reference in New Issue
Block a user