Python 3.11 est en moyenne 25 % plus rapide que 3.10

https://www.applitech.ci/themes/user/site/default/asset/imagesBlog/image-1.png

Python 3.11 est–il vraiment le Python le plus rapide ? Une chose est

sûre, CPython 3.11 est en moyenne 25 % plus rapide que CPython 3.10

lorsqu'il est mesuré avec la suite de benchmark pyperformance, et

compilé avec GCC sur Ubuntu Linux. En fonction de la charge de travail,

l'accélération peut atteindre 10 à 60 %. L'équipe de développement de

Python a annoncé le 4 octobre les améliorations et les nouvelles

fonctionnalités de la version 3.11 de Python. Dans le but d’améliorer

les performances du langage de programmation Python, Microsoft a lancé Faster CPython.

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

Commenting for this entry has expired.