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 !

Codon, un compilateur Python avec les performances qui seraient équivalentes à celles de C/C++, et parfois supérieures,
Selon ses concepteurs

Le , par Bruno

40PARTAGES

19  0 
Python est l'un des langages de programmation les plus populaires, mais il est largement reconnu comme étant lent. Bien qu'il puisse être optimisé pour améliorer les performances, Python est apprécié pour des qualités autres que la vitesse, telles que la lisibilité, une courbe d'apprentissage gérable, un écosystème étendu et une utilité à la fois dans le monde universitaire et dans le monde des affaires.

Les informaticiens du Massachusetts Institute of Technology (MIT) et leurs collègues estiment avoir trouvé un moyen d’avoir l'accessibilité d'un langage de haut niveau et la vitesse d'un langage de bas niveau. Ils ont mis au point un compilateur Python appelé Codon qui transforme le code Python en code machine natif sans nuire aux performances d'exécution.


Codon est un compilateur Python haute performance qui compile le code Python en code machine natif sans aucune surcharge d'exécution. Les gains de vitesse typiques par rapport à Python sont de l'ordre de 10 à 100 fois ou plus, sur un seul thread, indiquent ses concepteurs. Selon eux, les performances de Codon sont généralement équivalentes (et parfois supérieures) à celles de C/C++. Contrairement à Python, Codon prend en charge le multithreading natif, ce qui peut entraîner des accélérations encore bien plus importantes. Codon est issu du projet Seq.

Seq un langage de programmation pour la génomique computationnelle et la bioinformatique

Grâce à une syntaxe compatible avec Python et à une multitude de fonctionnalités et d'optimisations spécifiques au domaine, Seq rend l'écriture de logiciels de génomique de haute performance aussi facile que l'écriture de code Python, et permet d'obtenir des performances comparables (et dans de nombreux cas supérieures) à celles de C/C++.

Imaginez Seq comme un Python fortement typé et compilé statiquement : toutes les fonctionnalités de Python, renforcées par un système de type fort, sans aucune surcharge de performance. Seq est capable de surpasser le code Python jusqu'à 160 fois. Seq peut également surpasser un code C/C++ équivalent jusqu'à 2 fois sans aucune intervention manuelle, et prend également en charge le parallélisme de manière native. Les détails de l'implémentation et les benchmarks sont discutés dans notre article.

Dans le but d’améliorer les performances du langage de programmation Python, Microsoft lance Faster CPython. L'équipe de développement de Python a annoncé le 4 octobre 2021 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.

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.

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.

Codon met en œuvre la plupart des éléments du langage Python, mais pas tous. Certains modules Python n'ont pas été intégrés dans Codon. Il omet également des fonctionnalités telles que la manipulation dynamique des types et la réflexion en cours d'exécution, qui rendent le code plus difficile à analyser et à optimiser. Ce faisant, il peut s'appuyer sur un moteur de compilation à typage statique qui, associé à d'autres innovations telles qu'une représentation intermédiaire (RI) plus optimisable et plus souple, génère un code plus rapide.

Représentation intermédiaire

La plupart des compilateurs traduisent d'abord le programme source en une forme de représentation intermédiaire, puis le convertissent en code machine. La représentation intermédiaire (RI) est une version du code source original indépendante de la machine et du langage. Bien que la conversion du code en deux fois introduise une étape supplémentaire, l'utilisation d'une représentation intermédiaire offre l'avantage d'une abstraction accrue, d'une séparation plus nette entre les extrémités avant et arrière, et ajoute des possibilités de reciblage/compilation croisée. Les représentations intermédiaires se prêtent également à la prise en charge d'optimisations avancées du compilateur, et la plupart des optimisations sont effectuées sur cette forme du code.

De nombreuses représentations intermédiaires sont utilisées (certaines suggèrent qu'il pourrait y avoir jusqu'à une unique pour chaque compilateur existant), mais les différentes représentations se ressemblent plus qu'elles ne diffèrent. Une fois que l'on s'est familiarisé avec l'une d'entre elles, il n'est pas difficile d'en apprendre d'autres. Les représentations intermédiaires sont généralement classées en fonction de la position qu'elles occupent. Elles se situent entre un langage de haut niveau et le code machine.

Les RI qui sont proches d'un langage de haut niveau sont appelées RI de haut niveau, et les RI qui sont proches de l'assemblage sont appelées RI de bas niveau. Par exemple, une RI de haut niveau peut préserver des éléments tels que les indices de tableau ou les accès aux champs, alors qu'une RI de bas niveau les convertit en adresses et décalages explicites.

Codon a été développé à l'origine comme un framework pour la création de langages spécifiques à un domaine (DSL) très performants en Python. Les DSL sont des langages axés sur un objectif spécifique, par opposition à un langage de programmation général comme Python ou C. Parmi les exemples de DSL, citons CSS et SQL.

Langage spécifique à un domaine (DSL)

Un langage spécifique à un domaine (DSL) est un langage informatique spécialisé dans un domaine d'application particulier. Il s'oppose à un langage à usage général (GPL), qui est largement applicable à tous les domaines. Il existe une grande variété de DSL, allant de langages largement utilisés pour des domaines communs, comme le HTML pour les pages web, à des langages utilisés uniquement par un ou quelques logiciels, comme le code logiciel MUSH.

Les DSL peuvent être subdivisés en fonction du type de langage, et comprennent les langages de balisage spécifiques à un domaine, les langages de modélisation spécifiques à un domaine (plus généralement, les langages de spécification) et les langages de programmation spécifiques à un domaine. Les langages informatiques spécialisés ont toujours existé à l'ère de l'informatique, mais le terme "langage spécifique à un domaine" est devenu plus populaire en raison de l'essor de la modélisation spécifique à un domaine. Les DSL plus simples, en particulier ceux qui sont utilisés par une seule application, sont parfois appelés de manière informelle des mini-langages.

La frontière entre les langages à usage général et les langages spécifiques à un domaine n'est pas toujours nette, car un langage peut avoir des caractéristiques spécialisées pour un domaine particulier mais être applicable plus largement, ou inversement, il peut en principe être capable d'une application large mais dans la pratique être utilisé principalement pour un domaine spécifique.

Par exemple, Perl a été développé à l'origine comme un langage de traitement de texte et de collage, pour le même domaine que AWK et les scripts shell, mais a été principalement utilisé comme un langage de programmation à usage général par la suite. En revanche, PostScript est un langage Turing-complet et peut en principe être utilisé pour n'importe quelle tâche, mais dans la pratique, il est étroitement utilisé comme langage de description de pages.

Dérivé de Seq, un DSL pour la bio-informatique et la génétique, Codon est devenu un compilateur de langage largement compatible avec Python 3. Comme le décrit un document fourni à The Register avant sa sortie prévue le 16 mars, « Codon : A Compiler for High-Performance Pythonic Applications and DSLs », la chaîne d'outils « permet de développer des DSL qui partagent la syntaxe et la sémantique de Python avec des fonctionnalités spécifiques au domaine et des optimisations IR ».

Les auteurs de l'article - Ariya Shajii (Exaloop), Gabriel Ramirez (MIT CSAIL), Haris Smajlović (Université de Victoria, Canada), Jessica Ray (MIT CSAIL), Bonnie Berger (MIT CSAIL), Saman Amarasinghe (MIT CSAIL) et Ibrahim Numanagić (Université de Victoria) - affirment que Codon peut produire du code machine natif sans aucune surcharge d'exécution de Python, ce qui leur permet d'obtenir des performances comparables à celles du langage C avec des scripts Python.

« Contrairement à d'autres implémentations de Python axées sur les performances (telles que PyPy ou Numba), Codon est conçu dès le départ comme un système autonome qui se compile à l'avance en un exécutable statique et n'est pas lié à un moteur d'exécution Python existant (par exemple, CPython ou RPython) pour l'exécution », indique l'article. « En conséquence, Codon peut atteindre de meilleures performances et surmonter les problèmes spécifiques à l'exécution tels que le verrouillage global de l'interpréteur ».

Les auteurs évoquent divers DSL performants basés sur Codon et conçus pour la bio-informatique, la compression de données et la programmation parallèle, qui tirent parti de l'infrastructure du compilateur Codon. Codon peut également accélérer considérablement les programmes Python standard, bien que ceux qui s'appuient sur des bibliothèques externes telles que Django ou DocUtils doivent utiliser une passerelle CPython qui limite les performances à celles de CPython. Par exemple, sur le forum Codon, un développeur entreprenant rapporte qu'un simple script Fibonacci compilé par Codon s'est exécuté plus de 70 fois plus vite que la version CPython.

Saman Amarasinghe, professeur au MIT et chercheur principal de CSAIL, a déclaré au service de presse du MIT dans un communiqué fourni à The Register que Python est souvent utilisé par des experts du domaine qui ne sont pas des experts en programmation et qui n'ont pas optimisé leurs applications en termes de performances.

« Au lieu de devoir réécrire le programme à l'aide d'une bibliothèque implémentée en C comme numpy ou de le réécrire entièrement dans un langage comme le C, Codon peut utiliser la même implémentation Python et offrir les mêmes performances que celles obtenues en réécrivant en C », a expliqué Amarasinghe. « Je pense donc que Codon est la voie la plus facile à suivre pour les applications Python réussies qui ont atteint une limite en raison d'un manque de performance. Codon, nous dit-on, est déjà utilisé commercialement dans des domaines allant de la finance quantitative et de la bio-informatique à l'apprentissage profond. Et dans les mois à venir, attendez-vous à ce que les développeurs de Codon mettent en œuvre certaines fonctionnalités Python manquantes. »

Bien que Codon prenne en charge la quasi-totalité de la syntaxe de Python, il ne s'agit pas d'un remplacement intégral, et les bases de code importantes peuvent nécessiter des modifications pour être exécutées par le compilateur Codon. Par exemple, certains modules de Python ne sont pas encore implémentés dans Codon, et certaines fonctionnalités dynamiques de Python ne sont pas autorisées. Le compilateur Codon produit des messages d'erreur détaillés pour aider à identifier et à résoudre les incompatibilités.

Source : MIT

Et vous ?

Quel est votre avis sur le sujet ?

Que pensez-vous du projet Codon ?

Voir aussi :

Python 3.11 gagnera en performance au prix d'un peu plus de mémoire, les gains de vitesse semblent se situer entre 10 % et 60 %

Python 3.11 est en moyenne 25 % plus rapide que 3.10, compilé avec GCC sur Ubuntu Linux, l'accélération peut aller de 10 à 60 %

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

Avatar de jkarczmarczuk
Membre à l'essai https://www.developpez.com
Le 17/03/2023 à 1:26
Je pensais que le vieux mythe de vitesse nous lâcherait un jour, mais non... Je cite Fagus: "/.../ et voilà codon. ça veut dire qu'il y a une demande... Maintenant j'espère juste qu'un jour on aura directement dans le python standard l'accélération JIT (un jour...) et le typage optionnel /.../"

Pas nécessairement une demande. Il y a une occasion d'optimiser, et cette vieille publicité: "aussi bon ou même meilleur que C/C++" n'est plus si fascinante. SVP, n'oubliez pas les raisons de l'entêtement de Guido V.R., qui n'a jamais voulu optimiser même les appels fonctionnels terminaux, ce qui est une misère si on enseigne les algorithmes récursifs d'envergure... Non, aucune optimisation de la pile. Non, plusieurs décisions auront toujours lieu pendant l'exécution (par ex. la surcharge des types). Les diagnostics seront toujours plus importants que la performance...

J'ai enseigné Python pendant plusieurs années, et il était évident que la vitesse d'exécution ne pouvait être ma priorité, même si je n'avais jamais oublié Cython ni Numba. Mais la souplesse de la machine CPython, le 'dispatching' basé sur les descripteurs, la magie des décorations (parfois assez cauchemardesque...) -- tout ceci fait que JIT est vraiment bon dans des cas assez simples et ennuyeux. Et si on a l'ambition de montrer des exemples vraiment sophistiqués, il ne faut pas rêver trop...

De toute façon, je suggère d'étudier sincèrement la grande Histoire de l'Humanité, et en particulier l'Histoire des systèmes/doctrines politiques et l'histoire des religions.

Une Vérité fondamentale saute aux yeux: On ne peut vraiment "optimiser" un système existant. Rendre plus "juste", plus "efficace" (si on sait ce que cela veut dire), mieux adapté aux besoins (de qui?...), plus joli et élégant, etc. -- non, cela ne marchera jamais, et la même Vérité concerne les langages de programmation.
Le système (communisme ou ultra-libéralisme), le catholicisme, l'islam etc. sont viscéralement irréformables car leur stabilité [et le pouvoir des gourous/dictateurs, bénévoles ou non...] domine sur les perspectives d'"amélioration".
Puisque le progrès, l'évolution sont quand même inévitables, la solution est d'habitude la même: rejeter l'ancien (tuer si possible et pas trop difficile, n'est-ce pas?...) et proposer du nouveau. Avec les religions, on a eu presque toujours un bain de sang. Mais avec les langages de programmation, c'est beaucoup plus sympa, et utile. Oui, on commence souvent par un "dialecte", mais finalement on a Le Grand Schisme et la naissance des nouveaux paradigmes.

Qu'il en soit ainsi. Au travail! JK
.
6  0 
Avatar de tyrtamos
Expert éminent https://www.developpez.com
Le 15/03/2023 à 7:22
Bonjour

Je suis plutôt favorable à ce type de solution, pour avoir le "meilleur des deux mondes": un développement facile et une bonne rapidité d'exécution. Mais ma petite expérience de cython m'a un peu refroidi, au moins sur les points suivants:

- si on est obligé de faire une version spéciale du code source, pour ajouter ce qui manque au compilateur C (déclaration des variables, ...), cela fait un travail supplémentaire qui peut être important.

- la partie compilée en code natif est rapide, à condition de n'utiliser que des variables connues en C ou C++. Mais si on utilise des variables spécifiques Python qui obligent le code compilé à appeler souvent l'API Python, les avantages de rapidité s'écroulent! Il m'est même arrivé d'avoir une version compilée plus lente que la version Python...

- à voir si toutes les facilités de développement en Python sont acceptées par le compilateur, ou s'il faut en interdire certaines (ex: déclaration de fonctions à l'intérieur des fonctions?).

Jusqu'à présent, je ne trouve pas que Python soit particulièrement lent, si on utilise le plus souvent des modules compilés en code natif. C'est le cas, par exemple, quand on utilise des programmes graphiques utilisant Qt écrit en C++ (PyQt ou PySide): les programmes graphiques qu'on obtient sont largement assez rapides pour une utilisation normale. Si pour une utilisation normale, un réponse d'un demi seconde suffit, ce n'est pas utile de changer pour un langage plus compliqué pour diviser le temps de réponse par 100! Et pour les calculs scientifiques, les modules de type numpy sont déjà en code natif.

Je vais voir avec beaucoup d'intérêt et de curiosité comment ça se passe avec codon...
2  0 
Avatar de wiztricks
Expert éminent sénior https://www.developpez.com
Le 16/03/2023 à 11:30
Citation Envoyé par Fagus Voir le message
Maintenant j'espère juste qu'un jour on aura directement dans le python standard l'accélération JIT (un jour...) et le typage optionnel utilisé pour les optimisations (pas prévu aux dernières nouvelles)
A priori, le(un) JIT est (déjà) dans la version 3.11.

- W
2  0 
Avatar de Fagus
Membre expert https://www.developpez.com
Le 19/03/2023 à 21:36
Citation Envoyé par jkarczmarczuk Voir le message

Je pensais que le vieux mythe de vitesse nous lâcherait un jour, mais non... [...]
Pas nécessairement une demande. Il y a une occasion d'optimiser, et cette vieille publicité: "aussi bon ou même meilleur que C/C++" n'est plus si fascinante. SVP, n'oubliez pas les raisons de l'entêtement de Guido V.R., qui n'a jamais voulu optimiser même les appels fonctionnels terminaux, ce qui est une misère si on enseigne les algorithmes récursifs d'envergure... Non, aucune optimisation de la pile. Non, plusieurs décisions auront toujours lieu pendant l'exécution (par ex. la surcharge des types). Les diagnostics seront toujours plus importants que la performance...
.
Bonjour,
Merci pour la nuance et je suis tout à fait d'accord. Je ne pense sans doute comme tout le monde que python est un langage qui traîne des choix de conception, d'une époque où l'informatique était monocoeur avec des fréquences en augmentation rapide, et qui n'était pas conçu pour le succès actuel.
Mais bon, j'aime bien sa concision et surtout l'écosystème énorme.
La vitesse c'est survendu pour la plupart des gens bien sûr. D'ailleurs, les rares fois où j'ai besoin de vitesse, quelqu'un a déjà écrit en langage natif l'outil adapté pour python...

Je dis juste, que comme j'écris en python typé (pour l'analyse statique), si en plus ça accélérait gratuitement le code, ce serait bon à prendre.
Si en général python arrivait à la performance non pas du C++, mais du javascript moderne ce serait aussi bon à prendre. Je ne sais pas si c'est intrinsèquement à cause de python, mais les démo d'app. en python que j'avais testées sur mon android low cost avaient une lenteur perceptible. (mais pas pire que beaucoup de frameworks ...)

Pour la récursivité, j'avais lu avec grand intérêt la programmation dynamique, une méthode algorithmique pour résoudre des problèmes d'optimisation de Denis Hulo. En testant des optimisations naïves juste en mettant en cache les appels de fonction tout en gardant la récursivité, le gain de vitesse est conservé, mais on tape vite dans "RecursionError: maximum recursion depth exceeded"

Bon, avant je savais qu'il fallait écrire en itératif et pas en récursif, maintenant j'ai appris qu'en python c'est quasi-obligatoire
2  0 
Avatar de Fagus
Membre expert https://www.developpez.com
Le 15/03/2023 à 22:32
J'ai été étonné par les exemples. Peu de typage explicite et beaucoup d'inférence de type.
Il une possibilité de l'utiliser pour juste une fonction dans un code python juste en ajoutant un décorateur pour que la fonction soit accélérée en JIT.

On a eu cython (mais c'est pas très agréable), les modules de calcul intensif (qui marchent bien), Julia en réaction, numba, nuitka, etc. et voilà codon. ça veut dire qu'il y a une demande...

Maintenant j'espère juste qu'un jour on aura directement dans le python standard l'accélération JIT (un jour...) et le typage optionnel utilisé pour les optimisations (pas prévu aux dernières nouvelles)
1  0 
Avatar de nhugodot
Membre habitué https://www.developpez.com
Le 17/03/2023 à 18:13
Merci jkarczmarczuk (euh... ça serait sympa un nom aussi simple que Fagus stp...;D), code et philo, "la cathédrale vs le bazar", j'aime...
C'est darwiniste?
C n'a que peu changé et est toujours là... Ok, il a une descendance, C++, Obj-C, Java, C#, JS, Dart, ...
L'autre côté "de la force", du langage non pas optimisé machine (ça va, C, on est loin des machines de 1969...) mais humain (coder coûte plus cher que le run...), Basic, Pascal, Python, Julia, ...
Mais contrairement à C etc., Pascal etc. est mort. Deux espèces animales mutent, l'un a son ancètre encore bien vivant, avec ses descendants (méduses, requins...), l'autre a disparu (mammouth, néandertal...): une leçon par analogie à en tirer? Que C&consorts sont solides, rapides, adaptés à leur environnement, mais que Pascal&consorts, comme Homo Sapiens, est plus intelligent et... finira par dézinguer les ailerons de C? :-D

Et la prochaine étape de l'évolution (de langage ou d'humains?): ChatGPT... : nous sommes tous morts, C et Python, requins et humains. Je suis médusé...

Ok, je sors...
1  0 
Avatar de tyrtamos
Expert éminent https://www.developpez.com
Le 18/03/2023 à 17:21
Citation Envoyé par wiztricks Voir le message
A priori, le(un) JIT est (déjà) dans la version 3.11.
Je ne crois pas. La doc de la version 3.11 dit:

Code : Sélectionner tout
1
2
3
Is there a JIT compiler?

No. We’re still exploring other optimizations.
1  0 
Avatar de wiztricks
Expert éminent sénior https://www.developpez.com
Le 19/03/2023 à 10:43
Citation Envoyé par tyrtamos Voir le message
Je ne crois pas. La doc de la version 3.11 dit:

Code : Sélectionner tout
1
2
3
Is there a JIT compiler?

No. We’re still exploring other optimizations.
Snif... Ce qui en veulent devront encore se tourner vers des bibliothèques externes ou des implémentations autres que CPython.

- W
1  0