Mesurer, avec time.perf counter , le temps mis par la somme des…
Exercice supplémentaire · niveau 2 · NSI (première), chapitre 3 — Langages et programmation · Tester autrement : doctest, assertions, mesures
Énoncé
Mesurer, avec time.perf_counter, le temps mis par la somme des entiers de à calculée par boucle, puis par la formule . Que mesure-t-on exactement, et quelles précautions la mesure impose-t-elle ?
Corrigé
import time
def somme_lente(n):
s = 0
for i in range(1, n + 1):
s = s + i
return s
def somme_rapide(n):
return n * (n + 1) // 2
N = 2 * 10**6
t0 = time.perf_counter(); a = somme_lente(N); t1 = time.perf_counter()
b = somme_rapide(N); t2 = time.perf_counter()
assert a == b
print("boucle : %.3f s" % (t1 - t0)) # 0.051 s
print("formule : %.6f s" % (t2 - t1)) # 0.000002 s
Sur la machine de rédaction : seconde contre deux microsecondes. Le rapport est de l'ordre de .
Ce que l'on mesure exactement. Le temps écoulé sur cette machine, avec cet interpréteur, à cet instant. Ce n'est pas une propriété de l'algorithme : c'est une observation. Les chiffres ci-dessus ne se reproduiront pas à l'identique chez vous.
Les précautions.
perf_counteret nontime.time: le premier est conçu pour mesurer des durées, le second donne l'heure et peut reculer ;- mesurer plusieurs fois et garder le minimum, non la moyenne : les autres programmes de la machine ne peuvent qu'ajouter du temps, jamais en retrancher ;
- mesurer sur des tailles assez grandes pour que la durée dépasse largement la précision de l'horloge ;
- vérifier d'abord que les deux versions donnent le même résultat — d'où le
assert a == b. Comparer la vitesse de deux fonctions dont l'une est fausse n'a aucun sens.
Ce que la mesure ne dit pas : pourquoi. La boucle fait additions, la formule en fait trois — c'est cela, l'explication, et elle se raisonne sans chronomètre. La mesure confirme, elle ne démontre pas. Le comptage des opérations est l'objet du chapitre 7.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.