- L’interpréteur à appels de fin (tail-calling) de CPython affiche sur Windows x86-64 des performances environ 15 % supérieures à la méthode précédente
- Un gain de performances d’environ 5 % a aussi été confirmé sur macOS AArch64 (XCode Clang), tandis que Windows exploite une fonctionnalité expérimentale de MSVC 2026
- Dans les benchmarks pyperformance, la plupart des tests montrent une amélioration de vitesse, certains allant jusqu’à 78 %
- La principale raison de ce gain de performances serait une réinitialisation des heuristiques d’optimisation du compilateur et une amélioration de l’inlining
- Lors de la sortie officielle de Python 3.15, cela devrait être activé par défaut dans les builds basés sur Visual Studio 2026
Amélioration des performances de l’interpréteur à appels de fin
- Il a été mesuré que l’interpréteur à appels de fin de CPython est environ 15 % plus rapide sous Windows x86-64 que l’interpréteur switch-case traditionnel
- Selon pyperformance, la moyenne géométrique progresse de 15 à 16 %
- Certains benchmarks gagnent jusqu’à 78 % en vitesse, tandis qu’un petit nombre deviennent 60 % plus lents
- Sur macOS AArch64 (XCode Clang), un gain de performances d’environ 5 % a été constaté
- Ces résultats restent valables à condition qu’aucun changement n’intervienne pendant le cycle de développement de Python 3.15
Comparaison des structures d’interpréteur
- Les implémentations d’interpréteur en C se répartissent en trois approches : switch-case, computed goto et tail-call threaded
- switch-case : traitement des branchements pour chaque instruction
- computed goto : extension GCC/Clang permettant de sauter directement à l’adresse de branchement
- tail-call threaded : séparation de chaque gestionnaire de bytecode dans une fonction, puis appel de fin vers la fonction suivante
- Par le passé, les compilateurs C ne garantissaient pas l’optimisation des appels de fin, d’où un risque de débordement de pile
- Les attributs
__attribute__((musttail)) de Clang et [[msvc::musttail]] de MSVC permettent désormais de forcer les appels de fin
Résultats de build avec MSVC 2026 pour Windows
- Dans un build CPython utilisant une fonctionnalité expérimentale de MSVC, la plupart des benchmarks s’améliorent
- Exemples de résultats :
spectralnorm : 1,48x
nbody : 1,35x
bm_django_template : 1,18x
xdsl : 1,14x
- Cela a été officiellement intégré au document « What’s New » de Python 3.15
- L’interpréteur à appels de fin peut être utilisé dans les builds Visual Studio 2026 (MSVC 18)
- Les bibliothèques Python pures gagnent environ 15 % en vitesse, et les petits scripts jusqu’à 40 %
Causes du gain de performances
- Les appels de fin réinitialisent les heuristiques d’optimisation du compilateur, ce qui favorise une génération de code plus efficace
- La boucle d’interpréteur CPython actuelle se compose d’une fonction unique d’environ 12 000 lignes, ce qui entraîne fréquemment un échec de l’optimisation par inlining
- Le compilateur refuse souvent l’inlining pour éviter d’augmenter la taille du code
- Avec l’approche par appels de fin, les fonctions sont séparées, ce qui permet d’inliner les fonctions simples
- Par exemple, une fonction simple comme
PyStackRef_CLOSE_SPECIALIZED peut être inlinée
- Le même phénomène a également été observé dans les builds PGO (optimisation guidée par profil)
Méthode de build et d’utilisation
- Pour l’instant, seul le build depuis les sources est possible
- Une distribution binaire officielle est prévue une fois le développement de Python 3.15 stabilisé
Aucun commentaire pour le moment.