Un tableau de de noms, et un dictionnaire des mêmes noms
Exercice de TD · niveau 3 (difficile) · NSI (première), chapitre 5 — Les dictionnaires · Itérer, transformer
É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.
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.