8 points par GN⁺ 2024-01-10 | 1 commentaires | Partager sur WhatsApp

Ajout d’un compilateur JIT à Python 3.13

  • Brandt Bucher, développeur du cœur de CPython, a soumis une pull request pour ajouter un compilateur JIT à la branche Python 3.13.
  • Ce changement devrait constituer l’une des plus grandes évolutions de l’interpréteur CPython depuis l’ajout de l’interpréteur adaptatif spécialisé dans Python 3.11.

Qu’est-ce que le JIT ?

  • La compilation JIT (Just in Time) désigne une architecture dans laquelle la compilation a lieu lors de la première exécution du code.
  • Un compilateur JIT est un compilateur qui génère du code machine, par opposition à un compilateur AOT (Ahead of Time).
  • Le code Python est d’abord compilé en bytecode, mais ce bytecode n’a pas de signification directe pour le CPU et s’exécute via une boucle d’interpréteur de bytecode spécialisée.

Qu’est-ce qu’un copy-and-patch JIT ?

  • Le copy-and-patch JIT est un concept proposé en 2021, conçu comme un algorithme rapide pour les runtimes de langages dynamiques.
  • L’idée du copy-and-patch JIT consiste à copier les instructions correspondant à chaque opération puis à remplir (patcher) les arguments du bytecode.

Avantages et inconvénients du copy-and-patch JIT

  • Alors qu’un compilateur JIT « complet » compile du bytecode de haut niveau vers des instructions de bas niveau d’un langage intermédiaire (IL), le copy-and-patch JIT effectue la compilation du bytecode vers le code machine à l’aide d’un ensemble de templates.
  • Le copy-and-patch JIT évite d’avoir à exécuter une architecture de compilateur JIT complexe dans le runtime Python lui-même ; il suffit d’installer les outils JIT de LLVM sur la machine qui compile CPython depuis les sources.

Comment ce JIT fonctionne-t-il ?

  • Il étend une API nouvellement ajoutée à Python 3.13 afin que des optimiseurs enfichables puissent être détectés à l’exécution.
  • Le nouveau JIT est un optimiseur optionnel pour cette nouvelle architecture.
  • Lors de la compilation de CPython depuis les sources, fournir le flag --enable-experimental-jit permet de générer des templates de code machine pour le bytecode Python.

Ce JIT est-il plus rapide ?

  • Les premiers benchmarks montrent un gain de performances d’environ 2 à 9 %.
  • Ce JIT constitue une pierre angulaire pour une série d’optimisations susceptibles d’améliorer nettement les performances de Python.

L’avis de GN⁺

  • Le compilateur JIT ajouté à Python 3.13 représente une évolution importante pour améliorer la vitesse d’exécution de Python, notamment en augmentant l’efficacité sur les tâches répétitives.
  • Le copy-and-patch JIT propose une approche innovante pour améliorer les performances sans devoir intégrer une architecture JIT complexe dans le runtime Python de l’utilisateur.
  • Cette technologie devrait alimenter des discussions passionnantes dans la communauté Python et ouvrir de nouvelles perspectives pour l’optimisation des performances de Python.

1 commentaires

 
GN⁺ 2024-01-10
Avis Hacker News
  • Les gains de performance de 2 à 9 % entre les versions du logiciel sont intéressants. Même si ces petites améliorations peuvent parfois sembler décevantes, je préfère qu’elles s’accumulent régulièrement et rendent chaque version plus rapide que la précédente.
  • C’est chouette de voir la technique de « copy and patch » de Haoran Xu et Fredrik Kjolstad attirer l’attention. Je l’ai découverte pour la première fois via un billet de blog sur le projet de remake de LuaJIT de Xu. La manière de réutiliser des techniques existantes pour créer quelque chose de nouveau paraît très ingénieuse. Ce billet est recommandé à ceux qui veulent en apprendre davantage sur l’implémentation des langages. Xu y explique aussi que le retard des mises à jour du blog était dû à une refonte en arrière-plan.
  • Brandt a présenté ce sujet lors du sprint des développeurs core de CPython l’année dernière.
  • Malgré les travaux sur PyPy, Jython, GraalPy et IronPython, l’ajout d’un JIT à CPython est considéré comme une avancée importante pour l’écosystème Python. L’évolution après la version 3.13 est particulièrement attendue.
  • J’utilise Python pour tout sauf le développement web, donc toute amélioration des performances est très positive. L’écosystème Python est passé des requêtes sans état comme CGI ou mod_php à des processus de longue durée. Cela signifie-t-il qu’il faut redémarrer l’application locale à chaque modification d’une application web ? Certains développeurs utilisent une méthode qui redémarre automatiquement l’application à l’enregistrement d’un fichier.
  • Je me souviens que CPython était censé garder une base de code très simple, en laissant les autres implémentations se charger des optimisations.
  • L’article présente le JIT « copy and patch » comme une nouveauté, mais je me souviens que le QuickBASIC sous DOS utilisait une approche similaire. QuickBASIC patchait des blocs d’assembleur modèles en mémoire, ce qui produisait un code assembleur franchement médiocre.
  • Les progrès sur les performances de Python au cours des deux dernières années sont impressionnants. L’équipe core a fait de l’amélioration des performances un objectif sérieux et a obtenu des améliorations visibles.
  • J’aimerais voir davantage de financement investi dans PyPy. Mais PyPy n’offre pas de très gros avantages sur les petits programmes, car son temps de démarrage rapide n’est pas si bon. Et sur les gros programmes, des problèmes de compatibilité complexes peuvent apparaître. Si le JIT de CPython s’avère plus fiable ou offre un démarrage plus rapide, cela pourrait résoudre une partie de ces problèmes.
  • Le message de PR parodiant La Nuit avant Noël dans le dépôt GitHub de Python est plein d’esprit.