Skip to main content

Python, le langage de programmation dynamique créé par Guido van Rossum, est devenu l’un des outils les plus populaires pour les développeurs en raison de sa simplicité, de sa flexibilité et de sa puissance. À Neogeo, nous l’utilisons pour développer le backend de nos applications, pour faire des scripts d’administration et de la data-science.

Pour marquer la sortie de Python 3.13 le 7 Octobre dernier, nous allons passer en revue les changements importants qui ont été introduits dans les versions 3.9 (dernière version encore maintenue) à 3.13 de Python.

Ces nouvelles versions apportent des améliorations significatives en termes de performances, avec l’optimisation du code JIT et la suppression du GIL, véritable goulot d’étranglement pour les applications multi-thread. Elles offrent également des évolutions syntaxiques comme l’expression « matching ».

Autres nouveautés : la librairie standard de Python a elle aussi été mise à jour. La gestion du typage en Python a également été améliorée, avec l’introduction de types dynamiques. Nous verrons ces changements dans un article dédié.

Dans cet article, nous allons vous guider dans l’exploration des principaux changements apportés par Python 3.9 à 3.13, et nous vous proposerons des exemples pour exploiter ces nouvelles fonctionnalités et améliorer vos applications.

Performances

Dans la version 3.9 de Python, les performances de certaines structures built-in telles que dict, list ou set ont été améliorées. L’accès aux variables Python depuis les modules C a aussi été accéléré (nous n’aborderons pas ce sujet dans cet article).

La version 3.11 a été beaucoup optimisée, la documentation parle de 25% de gain de performances en moyenne, entre 10% et 60% d’amélioration selon le type de tâches.

Les travaux sur le GIL ont porté leurs fruits sur les versions 3.12 et 3.13. Le GIL, Global Interpreter Lock, est un mécanisme de Python qui évite l’accès simultané à une variable par plusieurs threads. Très simple pour le développeur, cela empêche la création de programmes multi-thread efficaces en Python. À une époque où on multiplie les CPU et les cores, c’est un fardeau pour notre petit langage. Les développeurs ont travaillé à retirer ce mécanisme, mais ils doivent procéder par étapes. Dans la version 3.12, Python peut désormais utiliser un GIL par interpréteur, on peut même le désactiver en ligne de commande dans la 3.13.

On peut noter qu’asyncio a été optimisé dans la version 3.12, avec jusqu’à 75% de gains de performances. Cette version de Python bénéficie d’une nouvelle API pour faire du monitoring de façon moins intrusive (impactant moins les performances).

En complément, la version 3.13 bénéficie aussi d’un compilateur JIT expérimental, il est activable en ligne de commande. La documentation indique que les gains de performances sont modestes. On peut imaginer que les versions suivantes de Python intégreront un compilateur JIT plus sophistiqué et plus performant.

Évolutions syntaxiques

La version 3.9 de Python voit l’introduction d’opérateurs d’union de dictionnaire | et | =. Sans être révolutionnaire, on peut toujours utiliser la fonction update pour faire la même chose, mais c’est plus simple à écrire.

Peut-être moins impactant, on peut désormais utiliser des expressions Python comme décorateur. Cela permet de faire des appels de fonctions ou demander un élément d’une liste quand on utilise le décorateur :

Par ailleurs, les chaînes de caractère ont deux nouvelles méthodes pour supprimer les suffixes et préfixes :

Le pattern matching est enfin arrivé en Python dans la version 3.10. C’est l’équivalent du célèbre switch-case existant en C ou en Java. Je reprends l’exemple de la documentation :

Le Structural Pattern Matching est très puissant en Python car on peut faire du unpacking de paramètres, de l’assignation de variables, rajouter des conditions, je vous recommande de parcourir la PEP636 pour plus de détails.

L’autre évolution syntaxique de Python 3.10 est la possibilité d’utiliser des parenthèses dans une clause with, notamment pour pouvoir utiliser plusieurs lignes :

La version 3.11 de Python a vu la création de groupes d’exceptions. On peut désormais envoyer plusieurs exceptions en même temps. Cela peut-être utile pour passer dans plusieurs sections except pour corriger plusieurs problèmes. Voici l’exemple très explicite de la documentation qui permet de comprendre comment s’en servir (encore merci la documentation pour l’exemple) :

L’autre ajout dans les Exceptions qui me semble très utile est la fonction add_note() qui permet d’ajouter des détails lors de l’interception/renvoi d’exception :

Si vous regardez bien dans les messages d’erreur de Python (dans le traceback notamment), vous verrez désormais que l’interpréteur indique plus précisément où l’erreur se situe dans la ligne et pas seulement dans quelle ligne est l’erreur.

La version 3.12 a vu une petite modification de syntaxe mais qui va simplifier l’utilisation des f-strings : on peut désormais utiliser les mêmes séparateurs de string dans le contexte que celui de la chaîne parente :

Par contre, il n’y a pas de changement syntaxique dans la version 3.13. Il y a tout de même des améliorations dans les messages d’erreurs et l’interpréteur retournera des messages d’erreurs en couleur.

Librairie standard

De moins en moins d’évolutions sont apportées à la bibliothèque standard. Dans la version 3.9 de Python, on note juste l’ajout d’un module zoneinfo pour gérer les fuseaux horaires :

Il y a aussi un nouveau module de tri topologique graphlib.

Dans la version 3.10 de la librairie standard, la fonction zip possède un nouveau paramètre strict qui permet de vérifier que la taille des deux itérateurs en entrée sont identiques.

La version 3.11 de la librairie voit un nouveau module tomllib permettant de lire le format de fichier TOML (mais pas de l’écrire). L’API est similaire à celle du module json :

Conclusion

On voit que Python est un langage de plus en plus stable, il y a peu de chose à rajouter à sa syntaxe pour améliorer la lisibilité du code. On peut dire la même chose de sa bibliothèque de fonctions standard.

Un gros travail pour améliorer les performances et le nettoyage de la bibliothèque standard a été entrepris et porte petit à petit ces fruits.

Nous avons hâte de profiter des avancées de cette nouvelle version 3.13 dans nos projets.

Ce qui bouge le plus dans Python en ce moment, c’est clairement le typage. Mais ça, ce sera pour un prochain article !


Rédacteurs : Mathilde Pommier et Sébastien Da Rocha