La revue de code, côté efficacité

Relire le code d'un autre sous l'angle du coût : la liste de contrôle en six points, le niveau d'une remarque (bloquante, suggestion, goût) et sa formulation.

  • 20 cartes
  • 5 thèmes
  • Gratuit

Le programme, thème par thème

Le poids de chaque thème suit celui que lui donne l'examen.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. Mises en situation
  5. Comprendre

Quelques cartes du deck

  • Revue de code : de quoi s'agit-il ?

    Voir la réponse

    Relecture d'une modification par une autre personne que son auteur, avant qu'elle soit intégrée au code commun.

    Elle attrape ce que l'auteur ne voit plus : défauts de logique, de lisibilité et de coût. Côté efficacité, on cherche ce qui deviendra lent quand les données grossiront.

  • Que relèves-tu dans cette fonction appelée avec deux listes de 100 000 éléments, et quel est le correctif ?

    ```python
    def communs(a, b):
    resultat = []
    for x in a:
    if x in b:
    resultat.append(x)
    return resultat
    `

    • x in b parcourt une liste, en O(n × m) ; passer b en set
    • La boucle for est lente en Python ; la remplacer par une boucle while ou par map
    • append recopie la liste à chaque appel ; préallouer resultat
    • Trier a avant la boucle pour que les recherches soient plus rapides
    Voir la réponse

    x in b parcourt une liste, en O(n × m) ; passer b en set

    Chaque x in b compare à tous les éléments de la liste : jusqu'à 10¹⁰ comparaisons ici. Un set retrouve un élément en temps constant en moyenne, et le coût devient O(n + m). append est amorti en O(1), et trier a n'aide en rien la recherche dans b.

  • La liste de contrôle côté efficacité : complexité cachée, structure de données …, travail …, allocations en boucle, entrées-sorties en boucle, cas limite de ….

    Voir la réponse

    La liste de contrôle côté efficacité : complexité cachée, structure de données inadaptée, travail répété, allocations en boucle, entrées-sorties en boucle, cas limite de taille.

    Les six points se repèrent surtout autour des boucles : une opération coûteuse dans une boucle se multiplie par le nombre de tours.

  • Code smell : de quoi s'agit-il ?

    Voir la réponse

    Indice, dans la structure d'un code, d'un problème de conception probable, sans que ce soit une erreur à proprement parler.

    Une fonction de 200 lignes ou une requête dans une boucle ne plantent pas : elles coûtent plus tard. On les signale pour qu'on s'en occupe avant que cela devienne un incident.

  • Le diff ajoute, dans une boucle sur les commandes, un SELECT * FROM lignes WHERE commande_id = ? par commande. Quel correctif demandes-tu ?

    • Une requête unique, par jointure ou IN
    • Ajouter un index sur commande_id et garder la boucle telle quelle
    • Lancer les requêtes de la boucle en parallèle
    • Remplacer SELECT * par la liste des colonnes utilisées
    Voir la réponse

    Une requête unique, par jointure ou IN

    L'index accélère chaque requête mais laisse N allers-retours ; la parallélisation les répartit sans les supprimer ; lister les colonnes est une bonne pratique, mais sans rapport avec le nombre de requêtes. Seule une requête groupée ramène le coût de N+1 à 1.