3 points par GN⁺ 2025-12-26 | Aucun commentaire pour le moment. | Partager sur WhatsApp
  • 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
    • Dans un environnement Visual Studio 2026, build avec la commande suivante
      $env:PlatformToolset = "v145"
      ./PCbuild/build.bat --tail-call-interp -c Release -p x64 --pgo
      
  • Une distribution binaire officielle est prévue une fois le développement de Python 3.15 stabilisé

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.