Concurrence et performances

« Python est lent », ce n'est vrai qu'à moitié, et l'autre moitié, c'est souvent l'algorithme. On mesure avant d'optimiser, on règle d'abord ce qui ne coûte rien, puis on choisit entre threads, processus et asyncio en sachant pourquoi. Le code natif arrive en dernier, quand les chiffres disent que ça vaut le coup.

Durée : 2 à 3 jours · Niveau : avancé

Pour qui : les développeurs Python dont les programmes sont trop lents, ou attendent le réseau ou le disque.

Prérequis : une bonne maîtrise de Python ; connaître générateurs et context managers aide.

Concurrency and performance

Jour 1 — Mesurer d'abord

  • Où part le temps ? timeit et cProfile
  • Espionner un programme en cours avec py-spy
  • La mémoire : tracemalloc et compagnie
  • La complexité algorithmique, sans les maths
  • Les structures méconnues : deque, Counter, bisect, heapq
  • En faire moins : générateurs et évaluation paresseuse
  • Mettre en cache avec functools.lru_cache
  • Mettre en cache des gros jeux de données avec diskcache
  • L'exception numpy : vectoriser plutôt que boucler

Jour 2 — Faire plusieurs choses à la fois

  • Concurrence VS parallélisme
  • Le GIL, et le Python free-threaded 3.13+
  • Threads, verrous et files
  • Maximiser l'usage des CPU avec le multiprocessing
  • concurrent.futures : une API pour les deux
  • Entrées/sorties non bloquantes avec asyncio
  • Tâches, TaskGroup et timeouts
  • Requêtes HTTP asynchrones avec httpx
  • Mélanger code synchrone et asynchrone

Jour 3 — Optionnel : sortir du processus

  • Lancer de longues tâches dans des files d'attente avec huey
  • Réessais, planification et résultats
  • Quand passer au code natif
  • Un aperçu de Cython
  • Compiler son programme avec Nuitka
  • Des extensions Rust avec PyO3 et maturin
  • Choisir, au cas par cas

Passez au niveau supérieur en Python !