Python 3.11 : vers de meilleures performances grâce à un interpréteur adaptatif spécialisé

Par:
fredericmazue

jeu, 16/06/2022 - 13:37

En dépit de toutes ses nombreuses qualités, le langage Python pèche au niveau des performances. Un document très intéressant, PEP 659, décrit comment Python 3.11 présentera des performances améliorées grâce à un interpréteur adaptatif spécialisé.

Le document décrit la situation de départ ainsi : Python est largement reconnu comme 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 des implémentations rapides de langages de script, comme V8 pour Javascript ou luajit pour lua. Plus précisément, nous voulons atteindre ces objectifs de performances avec CPython au bénéfice de tous les utilisateurs de Python, y compris ceux qui ne peuvent pas utiliser PyPy ou d'autres machines virtuelles alternatives.

Si cet objectif est loin d'être atteint, le premier pas sera une accélération de l'interpréteur. Une étape suivante pourrait être l'arrivée d'un compilateur JIT.

Le document explique : Il existe de nombreuses façons pratiques d'accélérer une machine virtuelle pour un langage dynamique. Cependant, la spécialisation est la plus importante, à la fois en elle-même et en tant que catalyseur d'autres optimisations. Il est donc logique de concentrer d'abord nos efforts sur la spécialisation, si nous voulons améliorer les performances de CPython. La spécialisation est généralement effectuée dans le contexte d'un compilateur JIT, mais la recherche montre que la spécialisation dans un interpréteur peut améliorer considérablement les performances, surpassant même un compilateur naïf.

L'accélération sera obtenue par un processus de remplacement des instructions lentes par des variantes plus rapides.

En ce qui concerne la spécialisation, le bytecode CPython contient de nombreuses instructions qui représentent des opérations de haut niveau pouvant bénéficier d'une spécialisation. Les exemples incluent CALL, LOAD_ATTRet LOAD_GLOBAL.BINARY_ADD L'introduction d'une « famille » d'instructions spécialisées pour chacune de ces instructions permet une spécialisation efficace, puisque chaque nouvelle instruction est spécialisée à une seule tâche, et est donc plus rapide.

Cet interpréteur adaptatif spécialisé ne posera aucun problème de compatibilité, mais en revanche il aura un prix en terme d'utilisation de la mémoire. Environ 25% de plus, d'après le document. Moyennant quoi les gains de vitesse pourront se situer en 10% et 60%

Il est prévu que cet interpréteur adaptatif spécialisé arrive avec Python 3.11 dont la disponibilité est prévue pour octobre 2022.