NSI (première) · Chapitre 5 · Exercice de TD
Un tableau de de noms, et un dictionnaire des mêmes noms
Les dictionnaires · Itérer, transformer · niveau 3 (difficile)
Énoncé
Un tableau de de noms, et un dictionnaire des mêmes noms. On effectue recherches. Estimer d'abord le nombre de comparaisons dans chaque cas, puis mesurer les deux temps avec time.perf_counter. Enfin, multiplier par et regarder lequel des deux temps bouge.
Corrigé
L'estimation, avant toute mesure. Dans un tableau, une recherche infructueuse parcourt les cases, une recherche fructueuse en parcourt en moyenne : recherches dans de noms, c'est de l'ordre de comparaisons. Dans un dictionnaire, chaque recherche calcule une position et compare une poignée de clés : le total reste de l'ordre de opérations. Le rapport attendu n'est pas un facteur deux ou dix — il est de l'ordre de , soit cinq cent mille.
import time, random
def mesurer_recherches(n, essais):
noms = ["nom%d" % i for i in range(n)]
annuaire = {nom: i for i, nom in enumerate(noms)}
cibles = [random.choice(noms) for _ in range(essais)]
t0 = time.perf_counter()
for c in cibles:
c in annuaire
t_dict = time.perf_counter() - t0
t0 = time.perf_counter()
for c in cibles:
c in noms
t_tab = time.perf_counter() - t0
return t_dict, t_tab
La mesure. Sur recherches (la version à dans un million de noms demande plusieurs minutes côté tableau — c'est déjà un résultat) :
| taille | dictionnaire | tableau | rapport |
|---|---|---|---|
| s | s | ||
| s | s |
Ce que dit la colonne du milieu, et c'est là l'essentiel. Quand est multiplié par , le temps du tableau est multiplié par — il suit la taille. Le temps du dictionnaire ne bouge pas : mesuré, il varie d'un facteur d'une exécution à l'autre — autant dire du bruit, quand le tableau, lui, est exactement cent fois plus lent. Ce n'est pas « le dictionnaire est plus rapide », c'est « le dictionnaire ne ralentit pas ». Sur dix millions d'entrées, le tableau serait cent fois plus lent encore, et le dictionnaire toujours au même prix.
Une précaution de mesure. Les cibles sont tirées avant les deux boucles et réutilisées telles quelles : sans cela on comparerait deux jeux de recherches différents, et un tirage plus favorable au tableau fausserait tout. Mesurer, c'est d'abord s'assurer qu'on mesure la même chose deux fois.
100 % gratuit
Essaie le suivant avec le tuteur
- L'exercice suivant avec le tuteur, sans compte : il guide pas à pas, sans donner la réponse
- 16 autres exercices corrigés dans ce chapitre, et 20 à chercher avec le tuteur
- Le podcast et la vidéo du chapitre et la correction filmée du TD : 2 minutes sans compte
Sans compte : le cours, 2 minutes de podcast et de vidéo et un exercice avec le tuteur. Pour tout le reste : inscription gratuite en 30 secondes, sans carte bancaire.