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 :
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.