Module diueil-TP_tris.complexite_temps
Utilitaires pour les mesures de temps et les complexités
Expand source code
#!/usr/bin/python3
#-*- coding: utf8 -*-
"""
## Utilitaires pour les mesures de temps et les complexités
"""
pass
import time
import random
import copy
# Pour pouvoir créer un répertoire, ici pour y mettre les fichiers csv
import os
def generateurListeCsv(tri, n, nomFichier):
"""
generateurListeCsv prend en paramètres :
- tri : une chaine de caractère désignant si la liste est triée d'une certaine manière ou non : prend les valeurs "CROISSANT", "DECROISSANT" ou "ALEATOIRE";
- n : un entier correspondant au nombre d'éléments dans la liste;
- nomfichier : une chaine de caractères correspondant au nom de fichier en ".csv" ( ex : "toto.csv" )
generateurListeCsv génère un fichier csv contenant une liste d'entier triée croissante, décroissante ou non triée.
"""
pass
# On crée le dossier qui va accueillir les fichiers csv s'il n'existe pas
path_csv = "./csv_files2test/"
if not os.path.exists(path_csv):
os.mkdir(path_csv)
fichier=open(path_csv+nomFichier,"w")
if tri.lower()=="croissant" :
i=0
while i<n :
if i!= n-1 :
fichier.write(str(i)+";")
else :
fichier.write(str(i))
i=i+1
elif tri.lower()=="decroissant" :
i=n-1
while i>=0 :
if i!=0 :
fichier.write(str(i)+";")
else :
fichier.write(str(i))
i=i-1
else :
i=0
while i<n :
if i!= n-1 :
fichier.write(str(random.randint(0,n))+";")
else :
fichier.write(str(i))
i=i+1
fichier.close()
def genereToutesLesListes(nombre, n):
"""
genereToutesLesListes prend en paramètre :
- nombre : entier >=1 correspondant au nombre de listes aléatoires à générer;
- n : entier correspondant au nombre dentiers dans les listes à générer
genereToutesLesListes génère des fichiers .csv contenant des listes d'entiers.
"""
pass
generateurListeCsv("croissant",n,"croissant"+str(n)+".csv")
generateurListeCsv("decroissant",n,"decroissant"+str(n)+".csv")
for i in range(nombre):
print("i : "+str(i))
generateurListeCsv("aleatoire",n,str(i)+"aleatoire"+str(n)+".csv")
def restitueListe(nomFichier):
"""
retitueListe prend en paramètre :
- une chaine de caractères correspondant au nom de fichier csv généré avec la procédure generateurListeCsv.
restitueListe renvoie :
- une liste d'entier
"""
pass
# le repertoire contenant les fichiers à tester
path_csv = "./csv_files2test/"
fichier=open(path_csv+nomFichier,"r")
ligne=fichier.read()
l=ligne.split(";")
n=len(l)
i=0
while i<n :
l[i]=int(l[i])
i=i+1
fichier.close()
return l
def mesureTempsExecutionTri(fonctionTri, liste):
"""
mesureTempsExecutionTri prend en paramètres :
- fonctionTri : une fonction de tri prenant en paramètre une liste d'entiers;
- liste : une liste d'entiers.
mesureTempsExecutionTri renvoie :
- un flottant correspondant au temps écoulé pour l'exécution de la fonction.
"""
pass
t1=time.time()
fonctionTri(liste)
dt=time.time()-t1
return dt
def mesure_temps(fonctionTri, nMax, nomFichierRapportCsv, nomListeATrierCsv):
"""
mesure_temps prend en paramètres :
- fonctionTri : une fonction de tri prenant en paramètre une liste d'entiers;
- nMax : un entier >=1, correspondant à la taille de la plus grande liste à tester;
- nomFichierRapportCsv : une chaine de caractères correpondant au nom du fichier csv contenant les données à renvoyer comme résultat;
- nomListeATrierCsv : une chaine de caractères correpondant au nom du fichier csv contenant une liste de données (nombre entiers) à trier, le nombre de données à trier de la liste doit être >= nMax.
mesure_temps affiche le temps mis, et le nombre de tours de boucle effectué par fonctionTri pour effectuer son tri pour différentes longueurs des listes à trier, et génère un fichier csv contenant les résultat de ces mesures et comptages.
"""
pass
# On crée le dossier qui va accueillir les fichiers de rapports s'il n'existe pas
path_rapports = "./rapports_de_tests/"
if not os.path.exists(path_rapports):
os.mkdir(path_rapports)
fichier=open(path_rapports+nomFichierRapportCsv,"w")
fichier.write("n;"+nomFichierRapportCsv+" t(s)\n")
print("################### "+nomFichierRapportCsv+" #####################################")
tableau=[] #liste de listes de temps pour chaque valeur de n
tabn=[] #liste des valeurs de n
#mesure des temps d'exécution
listeAleatoire=restitueListe(nomListeATrierCsv)
assert len(listeAleatoire)>=nMax, "liste à traiter trop petite ou nMax trop grand"
tab=[]
n=1
while n<=nMax :
listeATrier=copy.deepcopy(listeAleatoire[:n])
t=mesureTempsExecutionTri(fonctionTri, listeATrier)
print("temps pour trier "+str(n)+" entiers d'une liste aléatoire : "+str(t)+" s")
fichier.write(str(n)+";"+str(t)+"\n")
n=n*2
fichier.close()
def mesure_complexite(fonctionTri, nMax, nomFichierRapportCsv, nomListeATrierCsv):
"""
mesure_complexite prend en paramètres :
- fonctionTri : une fonction de tri prenant en paramètre une liste d'entiers;
- nMax : un entier >=1, correspondant à la taille de la plus grande liste à tester;
- nomFichierRapportCsv : une chaine de caractères correpondant au nom du fichier csv contenant les données à renvoyer comme résultat;
- nomListeATrierCsv : une chaine de caractères correpondant au nom du fichier csv contenant une liste de données (nombre entiers) à trier, le nombre de données à trier de la liste doit être >= nMax.
mesure_complexite nécessite l'insertion de la fonction compteTourBoucle() au sein de chaque boucle (dans le code de la fonction testée) de la fonction à testée.
mesure_complexite affiche le temps mis, et le nombre de tours de boucle effectué par fonctionTri pour effectuer son tri pour différentes longueurs des listes à trier, et génère un fichier csv contenant les résultat de ces mesures et comptages.
"""
pass
# On crée le dossier qui va accueillir les fichiers de rapports s'il n'existe pas
path_rapports = "./rapports_de_tests/"
if not os.path.exists(path_rapports):
os.mkdir(path_rapports)
fichier=open(path_rapports+nomFichierRapportCsv,"w")
fichier.write("n;"+nomFichierRapportCsv+" t(s);"+nomFichierRapportCsv+" opérations\n")
print("################### "+nomFichierRapportCsv+" #####################################")
tableau=[] #liste de listes de temps pour chaque valeur de n
tabn=[] #liste des valeurs de n
#mesure des temps d'exécution
listeAleatoire=restitueListe(nomListeATrierCsv)
tab=[]
n=1
while n<=nMax :
listeATrier=copy.deepcopy(listeAleatoire[:n])
global spy #espion
spy=0 #espion
t=mesureTempsExecutionTri(fonctionTri, listeATrier)
print("nombre de tours de boucle : "+str(spy)) #espion
print("temps pour trier "+str(n)+" entiers d'une liste aléatoire : "+str(t)+" s")
fichier.write(str(n)+";"+str(t)+";"+str(spy)+"\n")
n=n*2
fichier.close()
def compteTourBoucle():
"""
procédure qui incrémente lorsqu'elle est appelée la variable globale spy déclarée dans le programme d'appel : permet de compter les tours de boucle
"""
pass
global spy
try:
spy=spy+1
except NameError :
pass
def fctSort(liste):
"""
mise en forme de la fonction sort pour effectuer le test de mesure de temps
"""
pass
liste.sort()
return liste
if __name__=="__main__" :
# p=24 #exposant de puissance de 2 pour la taille des listes à trier
# genereToutesLesListes(1, pow(2,p))
# p=10 #exposant de puissance de 2 pour la taille des listes à trier
# genereToutesLesListes(1, pow(2,p))
p=12 #exposant de puissance de 2 pour la taille des listes à trier
#p=8 #exposant de puissance de 2 pour la taille des listes à trier
mesure_temps(fctSort, pow(2,p), "testTempsSort.csv", "0aleatoire16777216.csv")
mesure_complexite(fctSort, pow(2,p), "testComplexSort.csv", "0aleatoire16777216.csv")
Functions
def compteTourBoucle()
-
procédure qui incrémente lorsqu'elle est appelée la variable globale spy déclarée dans le programme d'appel : permet de compter les tours de boucle
Expand source code
def compteTourBoucle(): """ procédure qui incrémente lorsqu'elle est appelée la variable globale spy déclarée dans le programme d'appel : permet de compter les tours de boucle """ pass global spy try: spy=spy+1 except NameError : pass
def fctSort(liste)
-
mise en forme de la fonction sort pour effectuer le test de mesure de temps
Expand source code
def fctSort(liste): """ mise en forme de la fonction sort pour effectuer le test de mesure de temps """ pass liste.sort() return liste
def generateurListeCsv(tri, n, nomFichier)
-
generateurListeCsv prend en paramètres :
- tri : une chaine de caractère désignant si la liste est triée d'une certaine manière ou non : prend les valeurs "CROISSANT", "DECROISSANT" ou "ALEATOIRE";
- n : un entier correspondant au nombre d'éléments dans la liste;
- nomfichier : une chaine de caractères correspondant au nom de fichier en ".csv" ( ex : "toto.csv" )
generateurListeCsv génère un fichier csv contenant une liste d'entier triée croissante, décroissante ou non triée.
Expand source code
def generateurListeCsv(tri, n, nomFichier): """ generateurListeCsv prend en paramètres : - tri : une chaine de caractère désignant si la liste est triée d'une certaine manière ou non : prend les valeurs "CROISSANT", "DECROISSANT" ou "ALEATOIRE"; - n : un entier correspondant au nombre d'éléments dans la liste; - nomfichier : une chaine de caractères correspondant au nom de fichier en ".csv" ( ex : "toto.csv" ) generateurListeCsv génère un fichier csv contenant une liste d'entier triée croissante, décroissante ou non triée. """ pass # On crée le dossier qui va accueillir les fichiers csv s'il n'existe pas path_csv = "./csv_files2test/" if not os.path.exists(path_csv): os.mkdir(path_csv) fichier=open(path_csv+nomFichier,"w") if tri.lower()=="croissant" : i=0 while i<n : if i!= n-1 : fichier.write(str(i)+";") else : fichier.write(str(i)) i=i+1 elif tri.lower()=="decroissant" : i=n-1 while i>=0 : if i!=0 : fichier.write(str(i)+";") else : fichier.write(str(i)) i=i-1 else : i=0 while i<n : if i!= n-1 : fichier.write(str(random.randint(0,n))+";") else : fichier.write(str(i)) i=i+1 fichier.close()
def genereToutesLesListes(nombre, n)
-
genereToutesLesListes prend en paramètre :
- nombre : entier >=1 correspondant au nombre de listes aléatoires à générer;
- n : entier correspondant au nombre dentiers dans les listes à générer
genereToutesLesListes génère des fichiers .csv contenant des listes d'entiers.
Expand source code
def genereToutesLesListes(nombre, n): """ genereToutesLesListes prend en paramètre : - nombre : entier >=1 correspondant au nombre de listes aléatoires à générer; - n : entier correspondant au nombre dentiers dans les listes à générer genereToutesLesListes génère des fichiers .csv contenant des listes d'entiers. """ pass generateurListeCsv("croissant",n,"croissant"+str(n)+".csv") generateurListeCsv("decroissant",n,"decroissant"+str(n)+".csv") for i in range(nombre): print("i : "+str(i)) generateurListeCsv("aleatoire",n,str(i)+"aleatoire"+str(n)+".csv")
def mesureTempsExecutionTri(fonctionTri, liste)
-
mesureTempsExecutionTri prend en paramètres :
- fonctionTri : une fonction de tri prenant en paramètre une liste d'entiers;
- liste : une liste d'entiers.
mesureTempsExecutionTri renvoie : - un flottant correspondant au temps écoulé pour l'exécution de la fonction.
Expand source code
def mesureTempsExecutionTri(fonctionTri, liste): """ mesureTempsExecutionTri prend en paramètres : - fonctionTri : une fonction de tri prenant en paramètre une liste d'entiers; - liste : une liste d'entiers. mesureTempsExecutionTri renvoie : - un flottant correspondant au temps écoulé pour l'exécution de la fonction. """ pass t1=time.time() fonctionTri(liste) dt=time.time()-t1 return dt
def mesure_complexite(fonctionTri, nMax, nomFichierRapportCsv, nomListeATrierCsv)
-
mesure_complexite prend en paramètres :
- fonctionTri : une fonction de tri prenant en paramètre une liste d'entiers;
- nMax : un entier >=1, correspondant à la taille de la plus grande liste à tester;
- nomFichierRapportCsv : une chaine de caractères correpondant au nom du fichier csv contenant les données à renvoyer comme résultat;
- nomListeATrierCsv : une chaine de caractères correpondant au nom du fichier csv contenant une liste de données (nombre entiers) à trier, le nombre de données à trier de la liste doit être >= nMax.
mesure_complexite nécessite l'insertion de la fonction compteTourBoucle() au sein de chaque boucle (dans le code de la fonction testée) de la fonction à testée.
mesure_complexite affiche le temps mis, et le nombre de tours de boucle effectué par fonctionTri pour effectuer son tri pour différentes longueurs des listes à trier, et génère un fichier csv contenant les résultat de ces mesures et comptages.
Expand source code
def mesure_complexite(fonctionTri, nMax, nomFichierRapportCsv, nomListeATrierCsv): """ mesure_complexite prend en paramètres : - fonctionTri : une fonction de tri prenant en paramètre une liste d'entiers; - nMax : un entier >=1, correspondant à la taille de la plus grande liste à tester; - nomFichierRapportCsv : une chaine de caractères correpondant au nom du fichier csv contenant les données à renvoyer comme résultat; - nomListeATrierCsv : une chaine de caractères correpondant au nom du fichier csv contenant une liste de données (nombre entiers) à trier, le nombre de données à trier de la liste doit être >= nMax. mesure_complexite nécessite l'insertion de la fonction compteTourBoucle() au sein de chaque boucle (dans le code de la fonction testée) de la fonction à testée. mesure_complexite affiche le temps mis, et le nombre de tours de boucle effectué par fonctionTri pour effectuer son tri pour différentes longueurs des listes à trier, et génère un fichier csv contenant les résultat de ces mesures et comptages. """ pass # On crée le dossier qui va accueillir les fichiers de rapports s'il n'existe pas path_rapports = "./rapports_de_tests/" if not os.path.exists(path_rapports): os.mkdir(path_rapports) fichier=open(path_rapports+nomFichierRapportCsv,"w") fichier.write("n;"+nomFichierRapportCsv+" t(s);"+nomFichierRapportCsv+" opérations\n") print("################### "+nomFichierRapportCsv+" #####################################") tableau=[] #liste de listes de temps pour chaque valeur de n tabn=[] #liste des valeurs de n #mesure des temps d'exécution listeAleatoire=restitueListe(nomListeATrierCsv) tab=[] n=1 while n<=nMax : listeATrier=copy.deepcopy(listeAleatoire[:n]) global spy #espion spy=0 #espion t=mesureTempsExecutionTri(fonctionTri, listeATrier) print("nombre de tours de boucle : "+str(spy)) #espion print("temps pour trier "+str(n)+" entiers d'une liste aléatoire : "+str(t)+" s") fichier.write(str(n)+";"+str(t)+";"+str(spy)+"\n") n=n*2 fichier.close()
def mesure_temps(fonctionTri, nMax, nomFichierRapportCsv, nomListeATrierCsv)
-
mesure_temps prend en paramètres :
- fonctionTri : une fonction de tri prenant en paramètre une liste d'entiers;
- nMax : un entier >=1, correspondant à la taille de la plus grande liste à tester;
- nomFichierRapportCsv : une chaine de caractères correpondant au nom du fichier csv contenant les données à renvoyer comme résultat;
- nomListeATrierCsv : une chaine de caractères correpondant au nom du fichier csv contenant une liste de données (nombre entiers) à trier, le nombre de données à trier de la liste doit être >= nMax.
mesure_temps affiche le temps mis, et le nombre de tours de boucle effectué par fonctionTri pour effectuer son tri pour différentes longueurs des listes à trier, et génère un fichier csv contenant les résultat de ces mesures et comptages.
Expand source code
def mesure_temps(fonctionTri, nMax, nomFichierRapportCsv, nomListeATrierCsv): """ mesure_temps prend en paramètres : - fonctionTri : une fonction de tri prenant en paramètre une liste d'entiers; - nMax : un entier >=1, correspondant à la taille de la plus grande liste à tester; - nomFichierRapportCsv : une chaine de caractères correpondant au nom du fichier csv contenant les données à renvoyer comme résultat; - nomListeATrierCsv : une chaine de caractères correpondant au nom du fichier csv contenant une liste de données (nombre entiers) à trier, le nombre de données à trier de la liste doit être >= nMax. mesure_temps affiche le temps mis, et le nombre de tours de boucle effectué par fonctionTri pour effectuer son tri pour différentes longueurs des listes à trier, et génère un fichier csv contenant les résultat de ces mesures et comptages. """ pass # On crée le dossier qui va accueillir les fichiers de rapports s'il n'existe pas path_rapports = "./rapports_de_tests/" if not os.path.exists(path_rapports): os.mkdir(path_rapports) fichier=open(path_rapports+nomFichierRapportCsv,"w") fichier.write("n;"+nomFichierRapportCsv+" t(s)\n") print("################### "+nomFichierRapportCsv+" #####################################") tableau=[] #liste de listes de temps pour chaque valeur de n tabn=[] #liste des valeurs de n #mesure des temps d'exécution listeAleatoire=restitueListe(nomListeATrierCsv) assert len(listeAleatoire)>=nMax, "liste à traiter trop petite ou nMax trop grand" tab=[] n=1 while n<=nMax : listeATrier=copy.deepcopy(listeAleatoire[:n]) t=mesureTempsExecutionTri(fonctionTri, listeATrier) print("temps pour trier "+str(n)+" entiers d'une liste aléatoire : "+str(t)+" s") fichier.write(str(n)+";"+str(t)+"\n") n=n*2 fichier.close()
def restitueListe(nomFichier)
-
retitueListe prend en paramètre :
- une chaine de caractères correspondant au nom de fichier csv généré avec la procédure generateurListeCsv.
restitueListe renvoie :
- une liste d'entier
Expand source code
def restitueListe(nomFichier): """ retitueListe prend en paramètre : - une chaine de caractères correspondant au nom de fichier csv généré avec la procédure generateurListeCsv. restitueListe renvoie : - une liste d'entier """ pass # le repertoire contenant les fichiers à tester path_csv = "./csv_files2test/" fichier=open(path_csv+nomFichier,"r") ligne=fichier.read() l=ligne.split(";") n=len(l) i=0 while i<n : l[i]=int(l[i]) i=i+1 fichier.close() return l