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
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.
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.
Avis sur Hacker News
Avis selon lequel supprimer le GIL rendrait les programmes Python classiques plus lents et augmenterait la complexité
Mécontentement face au fait qu’il soit impossible de télécharger une version avec le JIT activé
Avis selon lequel cela ressemble à la comptine « Jack and Jill went up the hill »
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
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
Information selon laquelle la date de sortie a été déplacée du 2 octobre au 7 octobre
Avis selon lequel la dégradation des performances de
nogilest citée à 20 %, mais pourrait aller jusqu’à 50 %Avis selon lequel le titre est surprenant
Question cherchant un lien vers des travaux récents sur la parallélisation automatique