IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Pyjion, le compilateur de Microsoft pour Python atteint la version 1.0,
Il peut faire en sorte que Python s'exécute plus rapidement sans aucune modification du code

Le , par Bruno

97PARTAGES

12  0 
Le langage de programmation Python dispose déjà de nombreux moyens de s'exécuter plus rapidement, qu'il s'agisse des runtimes d'exécution alternatifs comme PyPy ou de modules écrits en C/C++. Pour permettre que le code Python s'exécute plus rapidement sans aucune modification du code, Anthony Shaw, membre de la Python Software Foundation et de Microsoft propose Pyjion, un compilateur de Microsoft pour Python 3.10 qui aujourd’hui, est à la version 1.0.

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
Ou, pour un module Python existant :

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

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de defZero
Membre extrêmement actif https://www.developpez.com
Le 14/11/2021 à 21:52
Que pensez-vous de Pyjion ?

Pourquoi pas, mais tant qu'a avoir une dépendance sur la CLR, autant partir sur du F# non ?

Seriez-vous prêt à l'utiliser pour prêt à l'utiliser pour vos projets Python ?

Non, car trop de dépendances plutôt lourdes, pour des projets Python qui pèse de plus en plus lourd au fil du temps.
Alors rajouter, CMake (passe encore, quoique Meson aurait été plus naturel) & .NET 6 & scikit-build, ça devient ridicule.

A un moment donné, il va bien falloir que les dirigeant de Python, ce rendent compte des limites de leurs bébé et je pense que là on commence déjà à toucher la fin du truc.
Personnellement, tant qu'a faire du .Net autant partir directement là dessus sans passer par Python qui rajoute une couche pour "le rendre plus rapide" ce qu'un langage de script ne sera jamais vraiment de part sa nature dynamique.
8  0 
Avatar de defZero
Membre extrêmement actif https://www.developpez.com
Le 15/11/2021 à 0:45
Les dépendances c'est pour compiler, non ? Une fois le code compilé on n'en a plus besoin, non ? Ou j'ai rien/mal compris...
@Beginner.
Malheureusement, ce n'est "que" (c'est déjà pas mal hein ) de la compilation de bytecode Python vers du CIL qui va donc tourner sur du .Net au final.
Ca ne fait "que" du Bytecode Python vers Bytecode .Net à la volé (d’où le JIT).
5  0 
Avatar de Pyramidev
Expert confirmé https://www.developpez.com
Le 16/11/2021 à 20:36
Citation Envoyé par Hominidé Voir le message
Utiliser pip pour télécharger une appli, ce n'est pas non plus compliqué.
Citation Envoyé par Hominidé Voir le message
Perso, je n'ai écrit qu'un projet sur pypi et c'est un petit jeu écrit avec tkinter. Les dépendances nécessaires à son fonctionnement sont ajoutées automatiquement lors de son téléchargement. L'usager fait juste pip3 monjeu, et le paquet de monjeu s'installe au bon endroit, sans autre intervention .
Ouh là. Attention, en Python, les installations avec pip sont un terrain miné pour les non initiés.

Pour chaque exécutable Python, pour chaque package installé, il ne peut exister qu'une seule version à la fois de ce package pour cet exécutable Python.
Du coup, quand deux projets différents dépendent chacun d'une version différente d'un package commun, on est obligé de lier ces deux projets à des exécutables Python différents.
C'est à cause de ça qu'on se tape des environnements virtuels en Python.

Installer directement avec pip, ce n'est pas un problème si on utilise le pip d'un exécutable Python qui se trouve déjà dans un environnement virtuel ou un conteneur.
Par contre, installer directement avec le pip du Python global, c'est ouvrir la porte à de potentielles futures emmerdes.
Ce qui est très insidieux, c'est que les emmerdes n'apparaissent pas tout de suite. En plus, il y a plein de tutoriels et de documentations qui balancent des pip install aux lecteurs sans les avertir des dangers, donc les non initiés sautent à pieds joints dans le piège.

De mon côté, quand un exécutable Python peut s'installer avec pip, je l'installe avec pipx : https://pypa.github.io/pipx/
Cela permet d'installer chaque exécutable dans un environnement virtuel Python différent.
Par exemple, aujourd'hui, avec pipx, je viens d'installer jello : https://pypi.org/project/jello/

Sur mon Ubuntu, ~/.local/bin/jello est un lien symbolique vers ~/.local/pipx/venvs/jello/bin/jello.
Dans mon PATH, j'ai ~/.local/bin qui contient les liens symboliques ajoutés par pipx. Chaque lien symbolique pointe vers un exécutable qui se trouve dans son propre environnement virtuel.
Dans l'environnement virtuel de jello, il y a une dépendance externe : Pygments.
Si un jour j'installe un nouvel exé en Python qui dépend aussi de Pygments, ces deux exécutables ne seront pas obligés d'être liés à la même version de Pygments.

Remarque : pipx existe aussi pour Windows.
4  0 
Avatar de Fagus
Membre éprouvé https://www.developpez.com
Le 15/11/2021 à 9:59
Citation Envoyé par Beginner. Voir le message
Ok merci. Le Bytecode .Net il s'exécute directement sous Windows ou pas ? En fait j'aimerais savoir si ce sera plus simple pour les utilisateurs... Si ces derniers auront moins de choses à faire pour exécuter le code...
Salut,
D'après le tuto de PyPI, ça n'a pas l'air. ça semble plus une façon d'accélérer un projet existant assez simplement, dans le futur ! En effet, les mots clés with ; async ; await ne sont pas encore implémentés (https://pyjion.readthedocs.io/en/lat...mitations.html).

D'autant plus qu'il faut une dépendance à .net 6 . Je ne sais pas sur quelles machines c'est installé par défaut, mais pas sur mon poste ni à mon boulot. (Sachant que jadis je n'ai jamais réussi à lancer certains programmes .net de versions récentes sur ces machines hors ligne car l'installateur hors ligne plantait sur certains postes).

À choisir, je te conseille d'utiliser un installeur pour les gens sous windows qui n'ont pas python sur leur poste. Personnellement après avoir bien galéré avec les différents scripts de génération de binaire windows, qui soit étaient complexes (tendent à inclure des dépendances inutiles à blacklister), soit ralentissaient le lancement, je trouve que winpython est assez simple : c'est portable, il suffit d'y installer son projet et de le distribuer (il faut quand même se faire un script pour créer le lien sur le bureau, etc.)
2  0 
Avatar de Metal3d
Nouveau membre du Club https://www.developpez.com
Le 16/11/2021 à 6:57
Python n'est pas si lent. La plupart des projets que j'ai développé avec Python sont assez rapides.pour ne pas gêner l'utilisation. Personne ne remarque vraiment sa "lenteur" quand les utilisateurs font tourner mes projets.
Python est rapide de base. Certe pas autant que des projets codés en C ou en Go mais bon sang ça va.
Il est adapté à un type de développement, pas à tous. Mais pour un script de traitement, une API REST, en interface au machine learning ou même pour du jeu, il fonctionne très bien.

Au sein de Belender il ne pose pas de soucis.

Si vraiment la vitesse compte, il vaut mieux choisir un autre langage au lieu de vouloir à tout prix passer par des trucs qui tentent des pirouettes de ninja pour accélérer Python en y installant des gigas de dépendances.

Pyinstaller crée un exécutable pratique à distribuer. Ça suffit largement pour sa distribution à des néophytes. Pour ma part je vais rester dans la logique de base. Utiliser Python tel quel, avec ses défauts et tout ses avantages. Et utiliser Go quand j'ai de vrais besoins de vitesse, de parallélisme ou des besoins particuliers sur de la gestion de flux. Non ?
2  0 
Avatar de fidopm
Candidat au Club https://www.developpez.com
Le 16/11/2021 à 11:07
Bonjour,
dans votre article une phrase m'a fait bondir :
"Le créateur de Python a été embauché en novembre dernier par Microsoft, une entreprise favorable aux logiciels libres..."

Comment est-il possible d'écrire ça ? Microsoft est une des entreprises certes qui contribue à certains projets Open Source (différent de logiciels libres), mais rien qui ne fasse réellement avancer le monde du logiciel, ils préservent leurs vaches à lait !

N'oubliez pas que Microsoft est un adepte de la stratégie EEE (« Adopte, étend et étouffe ») : https://fr.wikipedia.org/wiki/Embrac...and_extinguish

Cordialement.
3  1 
Avatar de Beginner.
Membre expert https://www.developpez.com
Le 14/11/2021 à 22:39
Salut,

Au delà de la question de rapidité, est-ce que cela signifie qu'on peut faire des exécutables ?

Citation Envoyé par defZero Voir le message
Non, car trop de dépendances plutôt lourdes, pour des projets Python qui pèse de plus en plus lourd au fil du temps.
Les dépendances c'est pour compiler, non ? Une fois le code compilé on n'en a plus besoin, non ? Ou j'ai rien/mal compris...
1  0 
Avatar de Beginner.
Membre expert https://www.developpez.com
Le 15/11/2021 à 0:57
Ok merci. Le Bytecode .Net il s'exécute directement sous Windows ou pas ? En fait j'aimerais savoir si ce sera plus simple pour les utilisateurs... Si ces derniers auront moins de choses à faire pour exécuter le code...
1  0 
Avatar de jurassic pork
Expert confirmé https://www.developpez.com
Le 15/11/2021 à 16:09
hello,
Citation Envoyé par Fagus Voir le message
À choisir, je te conseille d'utiliser un installeur pour les gens sous windows qui n'ont pas python sur leur poste. Personnellement après avoir bien galéré avec les différents scripts de génération de binaire windows, qui soient étaient complexes (tendent à inclure des dépendances inutiles à blacklister), soient ralentissaient le lancement, je trouve que winpython est assez simple : c'est portable, il suffit d'y installer son projet et de le distribuer (il faut quand même se faire un script pour créer le lien sur le bureau, etc.)
Pourtant pyinstaller me semble fiable et en plus ne produit pas un fichier .exe démesuré.

Ami calmant, J.P
1  0 
Avatar de Fagus
Membre éprouvé https://www.developpez.com
Le 16/11/2021 à 14:10
Citation Envoyé par Metal3d Voir le message
Python n'est pas si lent. La plupart des projets que j'ai développé avec Python sont assez rapides [...]

Pyinstaller crée un exécutable pratique à distribuer. Ça suffit largement pour sa distribution à des néophytes. Pour ma part je vais rester dans la logique de base. Utiliser Python tel quel, avec ses défauts et tout ses avantages. Et utiliser Go quand j'ai de vrais besoins de vitesse, de parallélisme ou des besoins particuliers sur de la gestion de flux. Non ?
Je plussoie complètement. Si on est un peu obsessionnel sur l'optimisation, côté dév., on se retrouve facilement à être content d'avoir un programme qui démarre en 3s. et pas 15, ou une appli qui pèse 2Mo et pas 40.
Sauf que la plupart du temps, tout le monde s'en moque...

En effet, python est largement assez rapide pour l'usage courant en pratique sur un poste utilisateur. (et si on a besoin de coller aux performances de la machine, c'est en effet qu'il fallait voir ailleurs dès le début.)

Donc, oui, Pyinstaller c'est très bien pour l'usage courant.

Les compilateurs JiT (PyPy, Pyjion), c'est pour les tâches intensives écrites en python (ex, serveur en python...).
Citation Envoyé par Beginner.
Ces outils que vous mentionnez c'est pour faire un exécutable si j'ai bien compris mais quelles sont les raisons pour lesquelles vous faites des exécutables ?

-Est-ce parce que l’exécution serait plus rapide ?

-Est-ce parce que cela permet de "cacher" le code , en fait je ne sais pas si le code source est accessible depuis un exécutable mais je pose la question...
- Pyinstaller et consorts n'est pas plus rapide (et a un "warm up time" en mode "single file" vu qu'il décompresse tout dans %temp% je crois)
- Le code n'est pas caché du tout. D'ailleurs, les langages non-compilés peuvent juste avoir recours à un obfuscateur pour cacher le code (je ne sais pas si ça existe en python). Si j'avais à protéger mollement un bout de code, je suppose que j'écrirais un module python compilé depuis nim lang, ça a l'air très facile.
1  0