Exemples d'optimisations réalisées

Pierre Beyssac et son script signal.eu.org/rail/

Source :

Echange sur Mastodon

Gain : x60

Verbatim :

> passer son code au profiler, une bonne vieille technique qui semble un peu oubliée pour identifier rapidement où le code passe du temps. J'ai passé ainsi une de mes moulinettes, réécrit quelques bouts de code avec ajout de memo (cache), etc, bilan : vitesse d'exécution x60 environ (un script qui prenait 5-6 heures ne prend plus que quelques minutes).
> ça prend tous les horaires des trains ou trams d'un fichier GTFS, ça cherche les gares correspondantes sur la carte OpenStreetMap, et ça calcule le trajet du train avec le même backend OSRM que https://signal.eu.org/osm/. Ensuite c'est stocké en base pour faire du trainspotting ou afficher les trajets sur https://signal.eu.org/rail/
> tout ce truc a été écrit à partir du confinement de 2020 (+ fracture perso qui m'a encore + confiné), donc des morceaux de 30 mn par-ci, 1h par-là depuis. Je dirais entre 50 et 150 heures au total, facilement 20 à 40 pour ce script-là qui est central. Ça tournait très vite initialement car c'était très fruste et limité aux trains, je l'ai étendu au fil du temps pour mieux retrouver et distinguer les gares, quais, arrêts de tram, etc.
> donc forcément plus on veut un résultat subtil, plus il faut d'informations de décision, et je récupère tout ça dans la base OSM, et l'algo de décision s'est complexifié et ralenti (plus de requêtes en base de données notamment). Mais sur l'optimisation ça a été très rapide.
> comme je me disais qu'il y avait sûrement des améliorations triviales à faire (low hanging fruit comme disent les anglophones), j'ai testé le profiler Python que je n'avais jamais utilisé, pour voir ce qu'il mettrait en évidence dans le code. Et il m'a identifié une fonction qui prenait un temps énorme, appelée plein de fois.
> et voilà le patch (lignes avec +). Il est con comme la lune, il m'a fallu peut-être 10 mn pour écrire et voir ce que ça donnait. Je pensais que ça ne ferait pas de mal mais ne m'attendais pas à une telle efficacité. + 10-15 mn pour lire la doc du profiler Python afin de voir comment s'en servir.

image du patch
image script_Python_de_Pierre_Beyssac.png (6.6kB)
Diff de script Python

> le patch est bêtement de la memoization, idée assez basique. Comme une gare est facilement recherchée des centaines ou milliers de fois pour les multiples relations qui y passent (avec différents paramètres le cas échéant), on gagne vite à gâcher un peu de mémoire pour ne pas la rechercher à chaque fois dans la base et recalculer les scores des points trouvés.