14 points par GN⁺ 2024-09-29 | 3 commentaires | Partager sur WhatsApp

Principaux changements de Python 3.13

  • CPython v3.13.0 devrait sortir le 7 octobre 2024
  • Cette version inclut deux changements majeurs susceptibles d’avoir un impact important sur les performances de Python
    • une version "free-threaded" permettant de désactiver le Global Interpreter Lock (GIL)
    • la prise en charge expérimentale de la compilation Just-in-Time (JIT)

Global Interpreter Lock (GIL)

Qu’est-ce que le GIL ?

  • Python a été conçu et implémenté comme un langage interprété mono-thread à la fin des années 1980 par Guido Van Rossum
  • Python compile le code source en bytecode, puis l’interpréteur l’exécute
  • Un verrou global (GIL) est utilisé pour permettre un accès sûr aux objets depuis tous les threads
    • il s’agit d’un verrou d’exclusion mutuelle global qui empêche plusieurs threads d’exécuter le bytecode simultanément
  • Il limite l’utilisation de la mémoire partagée, mais favorise les performances en mono-thread

Pourquoi Python a-t-il un GIL ?

  • Au début des années 1990, la plupart des programmes étaient mono-thread, et les performances des processeurs monocœur augmentaient rapidement
  • Il n’était pas nécessaire de sacrifier les performances en mono-thread pour garantir la sûreté du multithreading
  • Il est possible d’exploiter plusieurs cœurs en utilisant plusieurs processus (module multiprocessing)

Pourquoi supprimer le GIL maintenant ?

  • Les développeurs core de Python souhaitent depuis longtemps supprimer le GIL, mais cela n’a pas été mis en œuvre en raison des craintes de dégradation des performances en mono-thread
  • Avec la généralisation récente des processeurs multicœurs, les limitations du multithreading liées au GIL deviennent problématiques
  • Le projet "Faster CPython", soutenu par Microsoft, a contribué à améliorer les performances de Python
  • Sam Gross a proposé une implémentation sans GIL, ce qui a conduit à l’adoption de la PEP 703
  • Plan d’introduction progressive : option expérimentale → support officiel → mode par défaut
  • C’est dans ce contexte qu’un plan de suppression progressive du GIL a été approuvé

Quelles sont les performances ?

  • L’activation du free-threading entraîne une baisse d’environ 20 % des performances en mono-thread
  • Le multithreading avec GIL désactivé montre des gains de performances significatifs
  • Le multithreading avec GIL activé est plus lent que le mono-thread
  • Le multithreading avec GIL désactivé offre des performances comparables au multiprocessing

Comment utiliser Python en free-threading ?

  • En installant Python 3.13.0rc2t avec pyenv, il est possible d’utiliser la version free-threading
  • Le GIL est désactivé par défaut, et il peut être réactivé à l’exécution avec -X gil=1
  • Si l’on importe un module qui ne prend pas en charge le mode sans GIL, le GIL est automatiquement réactivé

Compilateur JIT (Just-in-Time)

Qu’est-ce que le JIT ?

  • Contrairement à la compilation ahead-of-time traditionnelle, il s’agit d’une technique qui génère du machine code juste avant l’exécution
  • Avant Python 3.13, le bytecode était exécuté en étant converti en langage machine instruction par instruction
  • Avec l’introduction du JIT, le bytecode peut être converti en langage machine d’un seul coup puis mis à jour si nécessaire
  • La technique introduite dans Python 3.13 est un JIT "copy-and-patch", qui applique des correctifs à du native code à partir de bytecode correspondant à des modèles prédéfinis
  • Des compilateurs JIT plus avancés peuvent optimiser les zones de code "hot" fréquemment exécutées

Quel est l’impact du JIT ?

  • À court terme, cela ne changera probablement pas grand-chose à l’écriture ou à l’exécution du code Python
  • Mais on s’attend à des améliorations progressives des performances, qui pourraient permettre à Python de mieux rivaliser avec d’autres langages

Comment utiliser le JIT ?

  • Dans Python 3.13, le JIT est expérimental et n’est pas activé par défaut
  • Il peut être activé à la compilation avec l’option PYTHON_CONFIGURE_OPTS="--enable-experimental-jit"
  • À l’exécution, son activation peut être contrôlée avec PYTHON_JIT=0/1

Conclusion

  • Python 3.13 est une version majeure qui introduit dans le runtime de nouveaux concepts et fonctionnalités intéressants
    • la suppression du GIL et l’introduction du JIT annoncent des changements importants
  • Il n’y aura peut-être pas de bouleversement immédiat à court terme, mais l’impact à long terme sur les performances de Python devrait être positif
    • à mesure que le free-threading et le JIT gagneront en maturité, on peut s’attendre à un effet notable sur les performances, en particulier pour les tâches CPU-bound

Avis de GN⁺

  • Cette mise à jour de Python 3.13 devrait apporter de grands changements à l’écosystème Python. La suppression du GIL devrait lever les goulots d’étranglement du multithreading, tandis que l’introduction du JIT devrait améliorer la vitesse d’exécution globale.
  • Il faudra toutefois du temps pour que ces changements soient totalement stabilisés. Des problèmes de compatibilité peuvent apparaître avec les packages existants, notamment les C extensions, et de nouveaux bugs comme des race conditions peuvent survenir lors de la programmation multithread.
  • La lenteur de Python a souvent été pointée comme un défaut ; on peut espérer que cette mise à jour contribue à changer cette perception. Si Python conserve ses atouts de productivité et de lisibilité tout en gagnant en vitesse, il pourrait être adopté encore plus largement.
  • Il existe néanmoins une limite fondamentale liée à sa nature de langage à typage dynamique. Les efforts visant à bénéficier des avantages des langages à typage statique doivent aussi se poursuivre. L’utilisation active de fonctionnalités récemment introduites dans Python, comme le type hinting, ainsi que de Cython, pourrait apporter une réponse partielle.
  • Dans l’ensemble, Python 3.13 semble apporter des changements intéressants et positifs. On peut espérer que les développeurs comprendront bien ces évolutions et sauront les exploiter pour créer de meilleurs programmes Python.

3 commentaires

 
ilotoki0804 2024-09-30

La suppression du GIL et le JIT, même s’ils restent encore limités pour l’instant, constituent tous deux des avancées très importantes qui vont changer la trajectoire de Python. On peut espérer l’avenir de Python, qui se débarrassera de sa mauvaise réputation de « langage le plus lent » et sera utilisé dans encore plus de domaines à l’avenir.

 
ilotoki0804 2024-09-30

L’importance du free threading (suppression du GIL) est bien résumée dans la PEP 703, avec les avis de diverses personnes.
Par ailleurs, selon cette PEP, la baisse de performances en mono-thread ne serait que de 5 à 6 %, ce qui rend difficilement crédible l’affirmation de cet article et de certains commentaires HN selon laquelle il y aurait une baisse de 20 à 50 %. Il n’y a d’ailleurs aucune source vérifiable.

 
GN⁺ 2024-09-29
Avis sur Hacker News
  • Avis selon lequel supprimer le GIL rendrait les programmes Python classiques plus lents et augmenterait la complexité

    • Doute sur les bénéfices réellement obtenus
    • Si l’on doit exploiter au maximum plusieurs cœurs CPU, utilisation d’une approche où l’OS exécute plusieurs instances du programme afin d’ajouter la logique de parallélisation au programme
  • Mécontentement face au fait qu’il soit impossible de télécharger une version avec le JIT activé

    • Partage d’expérience indiquant qu’il est possible de compiler soi-même une version de Python 3.13, mais que beaucoup de gens n’essaient pas et ne donnent donc pas de retours
  • Avis selon lequel cela ressemble à la comptine « Jack and Jill went up the hill »

    • Confusion sur ce que signifie « up the hill »
    • Question sur le fait de savoir si le JIT a été publié, mais si le GIL a bien été supprimé
  • Expérience selon laquelle désactiver le ramasse-miettes dans de petits programmes à faible empreinte mémoire et à exécution courte améliore fortement la vitesse

    • Curiosité sur la possibilité d’automatiser cela
    • Mention du risque lié au cas limite où un petit programme consommerait toute la mémoire
  • Avis selon lequel il s’agit d’un bon résumé pour les personnes qui n’avaient pas été satisfaites des explications fournies lors des premières discussions sur la suppression du GIL en 2021

  • Question sur le fait de savoir s’il est vraiment impossible d’optimiser le cas sans GIL

    • Avis selon lequel une baisse de 20 % des performances est un vrai problème
  • Information selon laquelle la date de sortie a été déplacée du 2 octobre au 7 octobre

    • Lien connexe fourni
  • Avis selon lequel la dégradation des performances de nogil est citée à 20 %, mais pourrait aller jusqu’à 50 %

    • Le JIT n’aide pas beaucoup
    • Avis selon lequel il s’agit d’une version décevante, reflet des problèmes sociaux et d’entreprise de CPython
    • Affirmation selon laquelle certaines personnes promettent des fonctionnalités, font taire celles qui ne sont pas enthousiastes à 100 %, puis livrent des résultats en deçà des attentes
  • Avis selon lequel le titre est surprenant

  • Question cherchant un lien vers des travaux récents sur la parallélisation automatique

    • Lien fourni vers une approche où l’on écrit du code monothread et où le compilateur génère du code multithread