Rappelons que 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. 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.
Pyjion, une extension JIT (Just-In-Time) pour CPython qui compile le code Python en CIL natif et l'exécute à l'aide du CLR .NET. Il peut être installé par pip dans une installation CPython 3.10 sous Linux, Mac OS X ou Windows. En d’autres termes, Pyjion compile le bytecode natif de CPython en code machine. Sans Pyjion, CPython utilise une boucle d'évaluation maître (appelée frame evaluation loop) pour itérer sur les opcodes Le compilateur Pyjion a 3 étapes principales :
- construire une "table de pile" des types abstraits à chaque position d'opcode ;
- Compiler les opcodes CPython en instructions IL (ECMA335 CIL) ;
- Émettre les opcodes CIL dans le compilateur .NET EE pour les convertir en code machine/assemblage natif.
Pyjion peut faire en sorte que le code Python s'exécute plus rapidement sans aucune modification du code. Lors du Python Language Summit qui s'est tenu au PyCon 2021 au mois de mai, le créateur du langage Python, Guido van Rossum, a dévoilé des plans à court et à long terme pour rendre Python encore plus rapide. Le langage de programmation Python est relativement lent dans son implémentation CPython par défaut, bien qu'il existe de nombreux moyens de le rendre plus rapide, notamment des alternatives axées sur les performances comme PyPy.
Pyjion fonctionne en compilant les opcodes de la machine virtuelle Python en langage assembleur par le biais du compilateur .NET EE. Les tests de référence effectués par les responsables du projet montrent que Pyjion est environ deux à trois fois plus rapide que Python ordinaire dans le monde réel. Certaines optimisations permettent des gains de vitesse allant jusqu'à 10 fois. L'arithmétique régulière, qui est toujours un bon candidat pour une optimisation JIT, peut être un ordre de grandeur plus rapide.
Historiquement, van Rossum ne semblait pas se soucier des performances de Python, privilégiant la simplicité d'un compilateur moins bien optimisé. Mais le créateur du populaire langage de programmation Python a fait part de ses ambitions de le rendre 2 à 5 fois plus rapide, en remédiant à certaines de ses principales faiblesses par rapport à des langages plus rapides comme le C++.
Dans le cadre d'une contribution au US PyCon Language Summit 2021, van Rossum a publié un document sur GitHub, propriété de Microsoft, dans lequel il détaille certaines de ses ambitions pour faire de Python un langage plus rapide, promettant de doubler sa vitesse à partir de Python 3.11, l'une des trois branches de Python qui sortiront l'année prochaine, et actuellement en cours de développement officiel en tant que projet de niveau préalpha.
Le créateur de Python a été embauché en novembre dernier par Microsoft, une entreprise favorable aux logiciels libres, qui l'a fait sortir de sa retraite après un passage chez Dropbox. « Je m'ennuyais à rester assis à la maison pendant ma retraite », a fait savoir van Rossum dans sa présentation, un document PDF. « J'ai postulé chez Microsoft et j'ai été embauché. On m'a donné la liberté de choisir un projet. J'ai choisi de revenir à mes racines. C'est la façon dont Microsoft rend la pareille à Python ».
Plus tôt en octobre, Sam Gross a proposé une modification majeure du Global Interpreter Lock (GIL), l'implémentation de référence de Python, afin d'améliorer les performances multithreads de Python. « J'ai travaillé sur des modifications de CPython pour lui permettre de s'exécuter sans le verrouillage global de l'interpréteur. J'aimerais partager une preuve du concept de fonctionnement sans le GIL. Cette preuve de concept implique des changements substantiels internes à CPython, mais relativement peu de changements à l'interface C-API. Elle est compatible avec de nombreuses extensions C », a déclaré Sam Gross.
Notons que le Python Global Interpreter Lock, en termes simples, est un verrou qui permet à un seul thread de détenir le contrôle de l'interpréteur Python. Cela signifie qu'un seul thread peut être en état d'exécution à un moment donné. L'impact de le GIL n'est pas visible pour les développeurs qui exécutent des programmes monofilaires, mais elle peut constituer un goulot d'étranglement en termes de performances pour les codes multithread et liés au processeur.
Étant donné que le GIL ne permet l'exécution que d'un seul thread à la fois, même dans une architecture multithread avec plus d'un cœur de CPU, il a acquis la réputation d'être une fonctionnalité « déshonorante » de Python. Il a longtemps été considérée comme un obstacle à l'amélioration des performances multithread de CPython (et donc de Python en général). De nombreux efforts ont été déployés pour le supprimer au fil des ans, mais au prix d'une dégradation des performances monothread (en d'autres termes, en rendant la grande majorité des applications Python existantes plus lentes).
Pyjion n'est pas un runtime autonome comme PyPy, mais une bibliothèque installable qui fonctionne sous Python 3.10. Une fois installé, Pyjion peut être utilisé dans un programme simplement en important la bibliothèque Pyjion et en l'activant. Tout ce qui est exécuté après cette déclaration est compilé en JIT.
Installation de Pyjion
Pyjion est un module python qui peut être importé dans un environnement Python 3.10. Pour utiliser Pyjion, les éléments suivants sont nécessaire :
- CPython 3.10
- CMake 3.13 +
- .NET 6
- scikit-build
Après avoir importé pyjion, activez-le en appelant pyjion.enable() qui définit un seuil de compilation à 0 (le code ne doit être exécuté qu'une seule fois pour être compilé par le JIT) :
Code : | Sélectionner tout |
python -m pip install pyjion
Après avoir importé pyjion, le JIT doit être activé en utilisant la fonction enable :
Code : | Sélectionner tout |
import pyjion; pyjion.enable()
Tout code Python que defini ou importé après avoir activé pyjion sera compilé en JIT. Nul besoin d'exécuter les fonctions dans une API spéciale, c'est complètement transparent :
Code : | Sélectionner tout |
1 2 3 | >>> def half(x): ... return x/2 >>> half(2) 1.0 |
Il est également possible d’exécuter Pyjion contre n'importe quel script ou module :
Code : | Sélectionner tout |
pyjion my_script.py
Code : | Sélectionner tout |
pyjion -m calendar
Malgré sa popularité sans cesse croissante, en partie à cause de l'essor de la science des données et de son écosystème de bibliothèques logicielles d'apprentissage automatique comme NumPy, Pandas, TensorFlow de Google et PyTorch de Facebook, ces nombreux utilisateurs, programmeurs Python, estiment être insatisfaits par le critère de rapidité sur Python.
Pour certains, la prise en charge d’une multitude de bibliothèques est une excellente chose, mais les gains de performances ne semblent pas si impressionnants. Certaines fonctionnalités de Python ne sont pas encore implémentées dans Pyjion, comme les blocs et async/await, mais ces deux éléments sont sur la feuille de route. Pyjion comprend une couche middleware permettant aux applications WSGI de fonctionner sous Pyjion.
« Il semble que le langage soit maintenant 2 fois plus rapide. Mais cela devrait être plus autour de 10 à 100 fois. Par exemple, sur le benchmark spectralnorm, ils obtiennent une accélération de 1,4x alors qu'une conversion rapide de Julia m'a donné 17x », a déclaré un programmeur Python.
Les données sont sur une machine Linux X86_64. Les scripts des benchmarks sont dans le repo source de Pyjion. Certains benchmarks ont une valeur max/moyenne lente car le temps inclut la compilation JIT de grandes bibliothèques comme Pandas. conversion rapide de Julia m'a donné 17x », a déclaré un programmeur Python.
Comparaison entre Pyjion et les autres programmes
PyPy
PyPy est une implémentation de Python avec son propre JIT. La plus grande différence par rapport à Pyjion est que PyPy ne supporte pas tous les modules d'extension C sans modification, à moins qu'ils n'utilisent CFFI ou qu'ils fonctionnent avec le sous-ensemble sélectionné de l'API C de CPython que PyPy supporte. Pyjion vise également à supporter de nombreux compilateurs JIT alors que PyPy ne supporte que son propre compilateur JIT.
Pyston
Pyston est une implémentation de Python utilisant LLVM comme compilateur JIT. Par rapport à Pyjion, Pyston a un support partiel de l'API C de CPython mais pas un support complet. Pyston ne supporte également que LLVM en tant que compilateur JIT.
Numba
Numba est un compilateur JIT pour « le code Python orienté tableau et lourd en maths ». Cela signifie que Numba est axé sur le calcul scientifique alors que Pyjion tente d'optimiser tout le code Python. Numba ne supporte également que LLVM.
IronPython
IronPython est une implémentation de Python réalisée à l'aide de .NET. Alors qu'IronPython essaie d'être utilisable à partir de .NET, Pyjion n'a pas d'histoire de compatibilité avec .NET. Cela signifie également qu'IronPython ne peut pas utiliser de modules d'extension C alors que Pyjion le peut.
Psyco
Psyco était un module qui monkeypatche CPython pour ajouter un compilateur JIT personnalisé. Pyjion veut introduire une API C correcte pour ajouter un compilateur JIT à CPython au lieu de le monkeypatcher. Il est à noter que le créateur de Psyco est devenu l'un des co-fondateurs de PyPy.
Unladen Swallow
Unladen Swallow était une tentative de faire de LLVM un compilateur JIT pour CPython. Malheureusement, le projet a perdu son financement avant d'avoir terminé son travail après avoir dû passer beaucoup de temps à corriger des problèmes dans le compilateur JIT de LLVM (qui s'est grandement amélioré au cours des années suivantes).
Nuitka et Shedskin
Nuitka et Shedskin sont tous deux des transpilers Python vers C++, ce qui signifie qu'ils traduisent le code Python en code C++ équivalent. Etant un JIT, Pyjion n'est pas un transpilateur.
Source : Python
Et vous ?
Que pensez-vous de Pyjion ?
Seriez-vous prêt à l'utiliser pour vos projets Python ?
Voir aussi :
Python 3.11 améliore l'emplacement des erreurs dans les tracebacks, et apporte de nouvelles fonctionnalités
Python risque de perdre son Global Interpreter Lock, un composant clé de CPython, pour gagner beaucoup plus en rapidité
Les créateurs de Python dévoilent leurs plans d'accélération pour Python, qui promettent de le rendre 2 à 5 fois plus rapide sans casser aucun code existant
JetBrains et la Python Software Foundation annoncent une réduction de 30 % sur PyCharm valable jusqu'au 24 novembre, la totalité des fonds récoltés sera reversée à la fondation Python