Compter sans parcourir plusieurs fois
Exercice supplémentaire · niveau 3 (difficile) · sciences numériques et technologie (seconde), chapitre 6 — Listes et simulations aléatoires · Manipuler une liste
Énoncé
Pour connaître les effectifs des six faces d'un dé sur une longue série, comparer une solution par six appels à count et une solution par tableau d'effectifs. Mesurer avec time sur une liste d'un million de lancers.
Corrigé
import random, time
L = [random.randint(1, 6) for i in range(1000000)]
debut = time.time()
e1 = [L.count(v) for v in range(1, 7)]
print("count :", time.time() - debut)
debut = time.time()
e2 = [0] * 6
for x in L:
e2[x - 1] = e2[x - 1] + 1
print("effectifs :", time.time() - debut)
print(e1 == e2) # True : mêmes résultats
Les deux donnent les mêmes effectifs, mais la première parcourt la liste six fois (six millions de comparaisons) là où la seconde ne la parcourt qu'une.
Le chronomètre départage moins nettement qu'on ne l'attendrait, car count est écrit en C alors que la boucle est interprétée : l'avantage théorique de se réduit en pratique. La mesure corrige ici le raisonnement — et c'est la leçon : sur les performances, on mesure, on ne suppose pas. Le tableau d'effectifs garde toutefois l'avantage décisif de rester en un seul passage, ce qui compte quand les données arrivent au fil de l'eau et ne sont pas stockées.
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.