Il s’agit d’un projet financé par Microsoft, dont les membres comprennent l'inventeur de Python Guido van Rossum, l'ingénieur logiciel senior de Microsoft Eric Snow, et Mark Shannon qui est sous contrat avec Microsoft en tant que responsable technique du projet. « Python est largement reconnu comme étant lent. Alors que Python n'atteindra jamais les performances des langages de bas niveau comme C, Fortran, ou même Java, nous aimerions qu'il soit compétitif avec les implémentations rapides des langages de script, comme V8 pour Javascript », déclare Mark Shannon.
Python est un langage de programmation interprété, multi-paradigme et multi-plateformes. Il favorise la programmation impérative structurée, fonctionnelle et orientée objet. Il est doté d'un typage dynamique fort, d'une gestion automatique de la mémoire par ramasse-miettes et d'un système de gestion d'exceptions ; il est ainsi similaire à Perl, Ruby, Scheme, Smalltalk et Tcl.
Pour être performantes, les machines virtuelles pour les langages dynamiques doivent spécialiser le code qu'elles exécutent en fonction des types et des valeurs du programme en cours d'exécution. Cette spécialisation est souvent associée aux compilateurs Just-in-time (JIT), mais elle est bénéfique même sans génération de code machine. Le projet Faster CPython se concentre sur deux domaines majeurs de Python : un démarrage et une exécution plus rapides.
Notons que la spécialisation permet d'améliorer les performances, et l'adaptation permet à l'interprète de changer rapidement lorsque le modèle d'utilisation d'un programme change, limitant ainsi la quantité de travail supplémentaire causée par une mauvaise spécialisation.
Démarrage plus rapide
Python met en cache le bytecode dans le répertoire __pycache__ pour accélérer le chargement des modules. Dans la version 3.10, l'exécution des modules Python ressemblait à ceci :
Read __pycache__ -> Unmarshal -> Heap allocated code object -> Evaluate
Dans Python 3.11, les modules de base essentiels au démarrage de Python sont "bloqués". Cela signifie que leurs objets de code (et bytecode) sont alloués statiquement par l'interpréteur. Cela réduit les étapes du processus d'exécution des modules à ceci :
Statically allocated code object -> Evaluate
Le démarrage de l'interpréteur est désormais 10 à 15 % plus rapide dans Python 3.11. Cela a un impact important pour les programmes à courte durée d'exécution utilisant Python. Exécution plus rapide Les frames Python sont créés chaque fois que Python appelle une fonction Python. Cette trame contient des informations sur l'exécution. Les nouvelles optimisations des frames sont les suivantes :
- Rationalisation du processus de création de trames ;
- Éviter l'allocation de mémoire en réutilisant généreusement l'espace de trame sur la pile C ;
- Rationalisation de la structure interne de la trame pour qu'elle ne contienne que les informations essentielles. Les frames contenaient auparavant des informations supplémentaires de débogage et de gestion de la mémoire.
Les objets frame de l'ancien style ne sont maintenant créés que sur demande des débogueurs ou des fonctions d'introspection Python telles que sys._getframe ou inspect.currentframe. Pour la plupart du code utilisateur, aucun objet frame n'est créé du tout. En conséquence, presque tous les appels de fonctions Python ont été accélérés de manière significative. Nous avons mesuré une accélération de 3 à 7 % dans pyperformance.
Lors d'un appel de fonction Python, Python appelle une fonction C évaluatrice pour interpréter le code de cette fonction. Cela limite efficacement la récursion Python pure à ce qui est fiable pour la pile C. Avec 3.11, lorsque CPython détecte un code Python appelant une autre fonction Python, il crée un nouveau frame et "saute" vers le nouveau code à l'intérieur du nouveau frame. Cela évite d'appeler la fonction d'interprétation C.
Faster CPython explore les optimisations pour CPython. Comme dit précédemment, l'équipe principale est financée par Microsoft pour travailler sur ce projet à temps plein. Pablo Galindo Salgado est également financé par Bloomberg LP pour travailler sur le projet à temps partiel. Enfin, de nombreux contributeurs sont des bénévoles de la communauté.
Le langage Python est placé sous une licence libre proche de la licence BSD et fonctionne sur la plupart des plateformes informatiques, des smartphones aux ordinateurs, de Windows à Unix avec notamment GNU/Linux en passant par macOS, ou encore Android, iOS, et peut aussi être traduit en Java ou .NET. Il est conçu pour optimiser la productivité des programmeurs en offrant des outils de haut niveau et une syntaxe simple à utiliser.
La plupart des appels de fonctions Python ne consomment plus d'espace dans la pile C. Cela accélère la plupart de ces appels. Cela accélère la plupart de ces appels. Dans les fonctions récursives simples comme fibonacci ou factorielle, une accélération de 1,7x a été observée. Cela signifie également que les fonctions récursives peuvent récurer beaucoup plus profondément (si l'utilisateur augmente la limite de récursion). Nous avons mesuré une amélioration de 1 à 3 % de la performance de py.
« L'ajout d'un interprète spécialisé et adaptatif à CPython apportera des améliorations significatives en termes de performances. Il est difficile d'avancer des chiffres significatifs, car cela dépend beaucoup des benchmarks et de travaux qui n'ont pas encore été réalisés. Des expérimentations approfondies suggèrent des accélérations allant jusqu'à 50 %. Même si le gain de vitesse n'était que de 25 %, cela resterait une amélioration intéressante », déclare Shannon.
« Plus précisément, nous voulons atteindre ces objectifs de performance avec CPython afin d'en faire bénéficier tous les utilisateurs de Python, y compris ceux qui ne peuvent pas utiliser PyPy ou d'autres machines virtuelles alternatives », ajoute-t-il. Lorsque Devclass s'est entretenu avec Pablo Galindo, membre du conseil de direction de Python et développeur principal, au sujet du nouveau profileur de mémoire Memray, il a décrit comment l'équipe Python utilise le travail de Microsoft dans la version 3.11.
« L'une des choses que nous faisons est que nous rendons l'interpréteur plus rapide, déclare Pablo Galindo, membre du conseil de direction de Python et développeur principal. Mais il va également utiliser un peu plus de mémoire, juste un peu, parce que la plupart de ces optimisations ont une sorte de coût en mémoire, étant donné que nous devons stocker des choses pour les utiliser plus tard, ou parce que nous avons une version optimisée mais parfois, quelqu'un a besoin de demander une version non optimisée pour le débogage, donc nous devons stocker les deux. »
PEP 659 : spécialisation de l'interpréteur adaptatif
Le PEP 659 est l'un des éléments clés du projet Faster CPython. L'idée générale est que, bien que Python soit un langage dynamique, la plupart du code comporte des régions où les objets et les types changent rarement. Ce concept est connu sous le nom de stabilité des types. Au moment de l'exécution, Python essaie de rechercher des modèles communs et la stabilité des types dans le code en cours d'exécution. Python remplace alors l'opération en cours par une opération plus spécialisée.
Cette opération spécialisée utilise des chemins rapides disponibles uniquement pour ces cas d'utilisation/types, qui sont généralement plus performants que leurs équivalents génériques. Cela fait également appel à un autre concept appelé "inline caching", dans lequel Python met en cache les résultats des opérations coûteuses directement dans le bytecode. Le spécialisateur combinera également certaines paires d'instructions communes en une super-instruction. Cela réduit l'overhead pendant l'exécution.
Python ne se spécialise que lorsqu'il voit du code "hot" (exécuté plusieurs fois). Cela évite à Python de perdre du temps pour du code "run-once". Python peut également se déspécialiser lorsque le code est trop dynamique ou lorsque l'utilisation change. La spécialisation est tentée périodiquement, et les tentatives de spécialisation ne sont pas trop coûteuses. Cela permet à la spécialisation de s'adapter aux nouvelles circonstances.
Le projet pyperformance a pour but d'être une source faisant autorité en matière de benchmarks pour toutes les implémentations de Python. L'accent est mis sur les benchmarks du monde réel, plutôt que sur les benchmarks synthétiques, en utilisant des applications complètes lorsque cela est possible.
Source : Python
Et vous ?
« Python 3.11 est en moyenne 25 % plus rapide que 3.10 », êtes-vous d'avis ?
Que pensez-vous de Python 11 ?
Avez-vous une expérience avec Python ?
Êtes-vous pour ou contre la suppression du Global Interpreter Lock ?
Voir aussi :
Python 3.11 améliorera l'emplacement des erreurs dans les tracebacks et apporte de nouvelles fonctionnalités
La version 3.2 du framework Django est disponible, avec la découverte automatique d'AppConfig, elle apporte de nouveaux décorateurs pour le module d'administration
Django 2.0 est disponible en version stable, quelles sont les nouveautés dans cette version du framework Web écrit en Python ?
JetBrains soutient Django : bénéficiez d'une remise de 30 % pour l'achat d'une licence individuelle PyCharm Professional et l'intégralité des sommes perçues seront reversées à la Fondation Django