Adloun

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.