Python 3.13 devrait être livré avec un compilateur JIT de type "copy-and-patch"
Un compilateur JIT est un compilateur qui compile le code au moment de de l'exécution. Cela signifie que le code n'est pas compilé avant d'être exécuté, mais qu'il est compilé au fur et à mesure des besoins. Les compilateurs JIT sont souvent utilisés pour les langages interprétés - comme Perl, Ruby, PHP et JavaScript - car ils peuvent améliorer les performances du langage. Ces langages sont largement utilisés dans le développement Web, l'écriture de scripts et les tâches d'automatisation en raison de leur facilité d'utilisation et de leur processus de développement rapide. Python, qui est un langage interprété, ne disposait pas d'un compilateur JIT jusqu'ici.
En décembre 2023, Brandt Bucher a soumis une demande de fusion proposant d'ajouter un compilateur JIT à Python. Si cette proposition est acceptée, il s'agira de l'un des grands changements apportés à l'interpréteur CPython depuis l'interpréteur adaptatif spécialisé ajouté à Python 3.11. (Cet ajout a été réalisé par Mark Shannon et Brandt Bucher.) Le comportement d'un compilateur JIT diffère de celui d'un compilateur AOT (Ahead of Time) - comme le compilateur GNU C (GCC) ou Rustc de Rust. Ce dernier génère le code machine une fois et le distribue en tant qu'exécutable binaire. Le compilateur JIT proposée pour Python 3.13 est de type "copy-and-patch".
La compilation de type "copy-and-patch" est une technique de compilation simple destinée à la compilation juste à temps. Elle utilise la correspondance de motifs pour faire correspondre des modèles prégénérés à des parties d'un arbre syntaxique abstrait ou d'un flux de bytecode et émet un code précrit correspondant qui est ensuite collé pour insérer des adresses de mémoire, des adresses de registre, des constantes et d'autres paramètres afin de produire un code exécutable. Le code qui ne correspond pas aux modèles peut être soit interprété de manière normale, soit créé pour appeler directement le code de l'interpréteur.
En d'autres termes, un JIT de type "copy-and-patch" consiste à copier les instructions pour chaque commande et à remplir les blancs pour les arguments du bytecode. Le compilateur JIT de type "copy-and-patch" aurait été choisi pour sa simplicité et son efficacité par rapport à un compilateur JIT complet. Il évite la complexité et les ressources nécessaires à la compilation des bytecodes de haut niveau dans un langage intermédiaire, puis dans le code machine. Cette approche est particulièrement bénéfique pour le langage Python, qui fonctionne sur différentes architectures de CPU. Le "copy-and-patch" est une technique de compilation très jeune.
Le concept du "copy-and-patch" a été décrit pour la première fois par Fredrik Kjolstad et Haoran Xu dans un article datant de 2021. Une implémentation du "copy-and-patch" basée sur le bytecode est utilisée pour le compilateur JIT de Python 3.13. Selon un billet de blogue sur le sujet, les premiers benchmarks ont révélé que cette technique améliore les performances de 2 à 9 %. Bien que cela puisse sembler modeste, cela jette les bases d'optimisations plus importantes à l'avenir. Cette mise à jour ne vise pas seulement à obtenir des gains de performance immédiats, mais aussi à jeter les bases de futures avancées dans l'efficacité de Python.
L'ajout d'un compilateur JIT à Python suscite des réactions mitigées sur la toile
L'impact réel du compilateur JIT de Python sera déterminé par les optimisations futures qu'il permettra d'effectuer. Certains utilisateurs du langage sont ravis par cet ajout et affirment que cela ouvre la voie à de nouvelles possibilités à l'avenir et aidera à combler certaines lacunes. Cependant, certains critiques trouvent que cet ajout ne constitue pas un apport significatif au langage et que les ressources consacrées à ce développement pouvaient servir à soutenir des projets comme PyPy. D'autres estiment que Python sans JIT est déjà assez rapide dans la plupart des cas et que cet ajout semble destiné aux cas d'utilisation de calcul haute performance.
« Je pense que Python sans JIT est déjà assez rapide dans la plupart des cas. Je ne fais pas de science des données », note un critique. Un autre a écrit : « je ne vois tout simplement pas comment un compilateur JIT va faire une si grande différence. Nous avons déjà PyPy pour ceux qui ont besoin de performances purement Python et Numba pour certains types de besoins numériques ». On peut lire également : « CPython n'était-il pas censé rester très simple dans sa base de code, l'optimisation lourde étant laissée à d'autres implémentations ? J'aimerais que l'argent puisse être dépensé pour PyPy, résoudre les problèmes et le rendre plus performant ».
L'on peut relever quelques raisons pour lesquelles Python n'avait pas un compilateur JIT. Tout d'abord, Python est conçu pour être un langage portable. Cela signifie qu'il est conçu pour fonctionner sur une variété de plateformes différentes, dont Windows, Mac et Linux. Les compilateurs JIT peuvent être spécifiques à une plateforme, ce qui peut rendre difficile le portage d'un langage utilisant un compilateur JIT sur une nouvelle plateforme. Ensuite, Python est conçu pour être facile à apprendre et à utiliser. Les compilateurs JIT peuvent ajouter de la complexité à un langage, ce qui peut rendre son apprentissage et son utilisation beaucoup plus difficiles.
Enfin, Python est déjà un langage "très rapide". Même sans compilateur JIT, Python est souvent plus rapide que d'autres langages interprétés, tels que JavaScript. Bien que Python ne dispose pas d'un compilateur JIT, il existe un certain nombre de moyens d'améliorer les performances du code Python. L'une d'entre elles consiste à utiliser un accélérateur Python - comme PyPy et Nuitka. Les accélérateurs Python sont des compilateurs qui compilent le code Python en code machine natif. Cela peut améliorer considérablement les performances du code Python. Un autre moyen d'améliorer les performances du code Python est d'utiliser un profileur.
Un profileur est un outil qui vous permet d'analyser l'exécution d'un programme afin d'identifier les parties du code qui consomment le plus de ressources en matière de temps CPU, de mémoire, ou d'autres métriques de performance. En d'autres termes, il vous aide à identifier les parties de votre code qui sont lentes. Une fois que vous avez identifié ces parties, vous pouvez les optimiser pour améliorer les performances. Enfin, vous pouvez aussi améliorer les performances du code Python en utilisant un bon EDI. Un bon EDI peut vous aider à écrire un code efficace et peut également vous aider à identifier et à résoudre les problèmes de performance.
Et vous ?
Quel est votre avis sur le sujet ?
Que pensez-vous de l'ajout d'un compilateur JIT de type "copy-and-patch" à Python ?
Était-il nécessaire ? En quoi l'ajout d'un compilateur JIT pourrait-il impacter l'avenir de Python ?
Que pensez-vous des avis selon lesquels les ressources auraient pu être consacrées à d'autres projets ?
Voir aussi
Le plan de travail pour la future version 3.13 de Python a été dévoilé et vise la réduction d'au moins 50 % du temps passé dans l'interpréteur ainsi qu'une meilleure gestion de la mémoire
PyPy quitte Mercurial pour GitHub et affirme que "l'open source est devenu synonyme de GitHub", le projet s'attend à une meilleure visibilité et à plus d'engagements avec ce changement
Popularité des langages sur GitHub : Python, Go et JavaScript en progression, tandis que Java et C++ sont en légère baisse mais restent dans le Top 5, d'après GitHut 2.0