Utilisation de Python pour créer et utiliser des fonctions simples de calcul de moyenne et variance en identifiant l’effet des choix de programmation sur les temps et imprécisions des calculs.
Visualiser et exécuter le code de la vidéo
Sujet pdf du TP :
proxy.php?id=pdf-itc1-0-2Programme ce TP directement ici sur Basthon en y collant le code élève du prochain Basthon :
↑ Ce Basthon reste en cache du navigateur ↑
Visualiser le Basthon élèves
Visualiser le Basthon correction
Visualiser les liens Dropbox vers les différents documents de ce TD
Codes non exécutables indépants de Basthon et Dropbox (peuvent ne pas être à jour)
Code de la vidéo :
## Initialisation
from random import randint as rd
def Creation(N):
L = []
for _ in range(N):
Nmax = 10*N
nbr = rd(0,Nmax)
L.append(nbr)
return L
N = 10
L = Creation(N)
# print(L)
from statistics import mean,pvariance
Moy_Py = mean(L)
Moy_Py = round(Moy_Py,2)
Var_Py = pvariance(L)
Var_Py = round(Var_Py,2)
print("Moyenne Python:",Moy_Py)
print("Variance Python:",Var_Py)
## Moyenne
def Moyenne(L): # Complexité O(N) - Linéaire
'''Calcule et renvoie la moyenne d'une liste L d'entiers'''
s = 0
n = len(L)
for t in L:
s += t
m = s/n
return m
Moy_Pe = Moyenne(L)
Moy_Pe = round(Moy_Pe,2)
print("Moyenne Perso:",Moy_Pe)
## Etude de temps
from time import perf_counter as tps
def Etude(f,L):
tic = tps()
f(L)
toc = tps()
T = toc-tic
return T
def Etude_Totale(f):
Lnbr = [10*i for i in range(1,101)]
Ltps = []
for nbr in Lnbr:
print(nbr)
L = Creation(nbr)
T = Etude(f,L)
Ltps.append(T)
return Lnbr,Ltps
from matplotlib import pyplot as plt
plt.close('all')
def Affichage(fig,Lx,Ly,col):
plt.figure(fig)
plt.plot(Lx,Ly,'o'+col)
plt.show()
# plt.pause(0.01) # Non compatible Basthon
Lnbr,Ltps = Etude_Totale(Moyenne)
Affichage(1,Lnbr,Ltps,'k')
## Variance
def Variance_1(L): # Complexité O(n²)
'''Calcule et renvoie la variance d'une liste L d'entiers'''
s = 0
n = len(L)
for t in L: # O(n²)
s += (t-Moyenne(L))**2 # O(N)
m = s/n
return m
def Variance_2(L): # Complexité O(2n)=O(n)
'''Calcule et renvoie la variance d'une liste L d'entiers'''
s = 0
n = len(L)
moy = Moyenne(L)
for t in L:
s += (t-moy)**2
m = s/n
return m
Var_Pe = Variance_2(L)
Var_Pe = round(Var_Pe,2)
print("Variance Perso:",Var_Pe)
Lnbr,Ltps = Etude_Totale(Variance_1)
Affichage(2,Lnbr,Ltps,'k')
Lnbr,Ltps = Etude_Totale(Variance_2)
Affichage(2,Lnbr,Ltps,'r')
Code élèves :
''' Auteur: Denis DEFAUCHY
Contenu sous licence, consulter www.cpge-sii.com '''
'''0 - Bases Python'''
## 0-2 - Moyenne - Variance
## Préliminaires
N = 1000
from random import randint as rand
L = [rand(0,10*N) for i in range(N)]
from statistics import mean as moy
from statistics import pvariance as var
from time import perf_counter as tps
def T_exec(f,L,Nom):
'''f est une fonction prenant en argument une liste'''
tic = tps()
f(L)
toc = tps()
Temps = toc - tic
print(Nom,Temps,"s")
Moy_Py = moy(L)
Var_Py = var(L)
print("Moyenne de L",Moy_Py)
print("Variance de L",Var_Py)
T_exec(moy,L,"Moyenne python")
T_exec(var,L,"Variance python")
## Questions
# Question 1
Code de la correction :
''' Auteur: Denis DEFAUCHY
Contenu sous licence, consulter www.cpge-sii.com '''
'''0 - Bases Python'''
## 0-2 - Moyenne - Variance
## Préliminaires
N = 1000
from random import randint as rand
L = [rand(0,10*N) for i in range(N)]
from statistics import mean as moy
from statistics import pvariance as var
from time import perf_counter as tps
def T_exec(f,L,Nom):
'''f est une fonction prenant en argument une liste'''
tic = tps()
f(L)
toc = tps()
Temps = toc - tic
print(Nom,Temps,"s")
Moy_Py = moy(L)
Var_Py = var(L)
print("Moyenne de L",Moy_Py)
print("Variance de L",Var_Py)
T_exec(moy,L,"Moyenne python")
T_exec(var,L,"Variance python")
## Questions
# Question 1
def Moyenne(L):
N = len(L)
Somme = 0
for terme in L:
Somme += terme
Moyenne = Somme/N
return Moyenne
Moy = Moyenne(L)
print('Moy Python:',Moy_Py)
print('Moy Perso:',Moy)
print('Ecart moyenne: ',Moy-Moy_Py)
def Moyenne_Erreurs(L): # Version à éviter
N = len(L)
Moyenne = 0
for terme in L:
Moyenne += terme/N
return Moyenne
'''
Cette version divise par N chaque terme, les résultats de chaque division sont arrondis, on cumul alors un grand nombre d'erreurs d'arrondis
'''
Moy_Erreurs = Moyenne_Erreurs(L)
print('Ecart moyenne: ',Moy_Erreurs-Moy_Py)
# Question 2
T_exec(Moyenne,L,"Moyenne perso")
# Question 3
'''Complexité en O(N)'''
## Variance
# Question 4
def Variance(L): # O(N) :)
N = len(L)
Moy = Moyenne(L)
Somme = 0
for terme in L:
Somme += (terme - Moy)**2
Var = Somme/N
return Var
Var = Variance(L)
print('Var Python:',Var_Py)
print('Var Perso:',Var)
def Variance_N2(L): # O(N²) :(
N = len(L)
Somme = 0
for terme in L:
Somme += (terme - Moyenne(L))**2
Var = Somme/N
return Var
'''
Dans la version ci-dessus, on refait la moyenne à chaque calcul, c'est horrible !
'''
def Variance_Bis(L): # O(N) :)
N = len(L)
Moy = Moyenne(L)
L_Carre = [t**2 for t in L]
Moy_Carre = Moyenne(L_Carre)
Var = Moy_Carre - Moy**2
return Var
'''
Aucune des fonctions ci-dessus ne donne exactement le calcul réalisé par la variance du module statistics
'''
# Question 5
T_exec(Variance,L,"Variance perso O(N)")
T_exec(Variance_N2,L,"Variance perso O(N²)")
# Question 6
'''Complexité en O(N) pour la version Variance, évidemment à privilégier'''