ITC1 – TD 0-2

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-2

Programme 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

Liens :

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'''

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Les Sciences Industrielles de l'Ingénieur (SII) et l'Informatique du Tronc Commun (ITC) en CPGE par Denis DEFAUCHY