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.
- Notions
- Questions
- Ranger et relier
- Mises en situation
- 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 bparcourt une liste, en O(n × m) ; passerbenset- La boucle
forest lente en Python ; la remplacer par une bouclewhileou parmap appendrecopie la liste à chaque appel ; préallouerresultat- Trier
aavant la boucle pour que les recherches soient plus rapides
Voir la réponse
x in bparcourt une liste, en O(n × m) ; passerbensetChaque
x in bcompare à tous les éléments de la liste : jusqu'à 10¹⁰ comparaisons ici. Unsetretrouve un élément en temps constant en moyenne, et le coût devient O(n + m).appendest amorti en O(1), et trieran'aide en rien la recherche dansb.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_idet 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
INL'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.
- Une requête unique, par jointure ou