Adloun

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 dictionnairetableaurapport
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.