Python est un langage interprété populaire, mais réputé lent par rapport à des langages comme JavaScript ou C++. Mais ces dernières années, il a fait des progrès en matière de performance et plusieurs benchmarks révèlent que la version la plus récente présente une accélération notable. Selon le site officiel du langage, Python 3.11, publié il y a quelques jours, est entre 10 et 60 % plus rapide que Python 3.10. « En moyenne, nous avons mesuré une accélération de 1,25x sur la suite de benchmark standard », a écrit Pablo Galindo Salgado, membre de l'équipe de développement de Python, dans les notes de version de Python 3.11.
Wasti a également réalisé un test après la sortie de Python 3.11 pour voir à quel point il était rapide par rapport aux versions précédentes, mais également par rapport à d'autres langages. À l'aide d'un MacBook doté d'une puce M1 Pro, il a exécuté un code de simulation à N corps en utilisant Python 3.8, 3.11, Bun et C++17 (-O2). Pour mémoire, une simulation à N corps donne une approximation numérique de l'évolution d'un système de corps dans lequel chaque corps interagit continuellement avec tous les autres corps. La simulation à N corps est utilisée dans de nombreux autres problèmes de calcul scientifique.
Un exemple familier est une simulation astrophysique dans laquelle chaque corps représente une galaxie ou une étoile individuelle, et les corps s'attirent mutuellement par la force gravitationnelle. La simulation de l'écoulement turbulent des fluides et le calcul de l'illumination globale en infographie sont d'autres exemples de problèmes faisant appel à la simulation à N corps. Wasti a présenté les résultats obtenus lors du test dans un billet de blogue sur son site Web personnel. Pour exécuter cette simulation, Python 3.8 aurait mis 96,79 secondes, alors que Python 3.11 n'aurait mis que 31,98 secondes. C'est 3 fois plus rapide.
En outre, Wasti affirme que JavaScript est une bonne base de référence pour les performances du langage. Tout comme Python, il s'agit d'un langage de script flexible à typage dynamique, qui peut être exécuté dans le terminal et qui dispose d'une interface C-API bien établie. Il note que JavaScript n'est pas exactement un outsider dans cette comparaison. Toutefois, il a choisi de faire cette comparaison, car JavaScript est également très populaire et réputé plus rapide que Python. Wasti affirme que Bun, un moteur d'exécution JavaScript rapide, aurait mis 0,768 seconde pour exécuter la simulation, soit 41 fois plus vite que Python 3.11.
Bun permet de regrouper, transpiler, installer et exécuter des projets JavaScript et TypeScript. Il s’agit d’un runtime JavaScript avec un bundler natif, un transpiler, un task runner et un client npm intégrés. Bun est conçu pour remplacer les application ou scripts JavaScript et TypeScript sur l’ordinateur local. Il implémente nativement des centaines d'APIs Node.js et Web, y compris environ 90 % des fonctions Node-API (modules natifs), fs, path, Buffer et plus encore. L'objectif de Bun est d'exécuter la plupart des codes JavaScript en dehors des navigateurs, en apportant des améliorations de performance et de complexité à l’infrastructure.
Le troisième langage utilisé par Wasti lors de ce test est le C++ (C++17). Il s'agit d'un langage compilé, ce qui signifie qu'il ne bénéficie pas de la commodité de Python et de JavaScript. En plus d'un typage strict et d'une syntaxe généralement moche, le C++ nécessite également une compilation préalable. Selon Wasti, il faut 0,183 seconde pour compiler le code C++ avec -O2. Ensuite, en exécutant le binaire, le C++ met 0,423 seconde à exécuter la simulation, soit 1,8 fois plus vite que JavaScript. « Pour moi, ce chiffre représente la performance "maximale" qu'un langage comme Python pourrait atteindre », a déclaré Wasti.
« Je pense que c'est génial que Python améliore ses performances. Le langage a une syntaxe très agréable et est souvent le premier langage enseigné aux nouveaux programmeurs », a-t-il ajouté. En outre, d'autres sources estiment que Python 3.11 est une énorme amélioration dans le domaine des performances par rapport aux versions précédentes de CPython. Python 3.11 serait un grand changement pour l'augmentation des performances et pour rendre cette implémentation de facto de Python plus compétitive par rapport à Pyston et PyPy. Python 3.11 apporte également de nouvelles fonctionnalités très utiles.
Parmi les principales fonctionnalités, citons l'amélioration du typage, l'ajout de la prise en charge des groupes de tâches avec E/S asynchrones, la localisation fine des erreurs dans les traces, les groupes d'exceptions, la prise en charge de l'analyse de TOML dans la bibliothèque standard et divers changements de typage. L'ajout le plus important parmi les nombreuses améliorations individuelles des performances dans Python 3.11 est l'"interpréteur adaptatif spécialisé". L'interpréteur tente d'analyser le code en cours d'exécution et de remplacer les bytecodes généraux par des bytecodes spécifiques au type, car le type d'un objet change rarement.
Par exemple, les opérations binaires telles que l'addition et la soustraction peuvent être remplacées par des versions spécialisées pour les flottants, les entiers et les chaînes de caractères. Les utilisateurs n'ont pas besoin de modifier le code de leurs programmes Python pour bénéficier des gains de vitesse de Python 3.11.
Source : Billet de blogue
Et vous ?
Quel est votre avis sur le sujet ?
Pensez-vous que la simulation à N corps est pertinente pour ce test ?
Que pensez-vous des améliorations de performances dans Python 3.11 ?
Voir aussi
Python 3.11 est disponible et s'accompagne d'une amélioration de la vitesse, de meilleures gestion des erreurs, du type self ainsi que des notes d'exception
Python 3.11 est en moyenne 25 % plus rapide que 3.10, compilé avec GCC sur Ubuntu Linux, l'accélération peut aller de 10 à 60 %
Bun, un nouveau moteur d'exécution JavaScript, livré avec un client SQLite3 rapide, il apporte un peu de concurrence pour Node et Deno
La compilation à la volée (just-in-time) ne serait pas ergonomique, selon Abe Winter qui propose des améliorations