Les implémentations Javascript modernes comme V8 (Chrome), SpiderMonkey (Firefox) et Chakra (IE / Edge) ont toutes une compilation JIT et un certain nombre d'autres optimisations pour améliorer les performances.
Pourquoi Python n'en a-t-il pas?
J'ai regardé PyPy et IronPython, qui revendiquent tous deux des gains de vitesse. PyPy Je ne comprends pas comment une implémentation Python écrite en Python, un langage interprété, sera plus rapide que l'implémentation de référence en C. IronPython, même idée mais je ne vois pas comment le .NET Framework augmentera la vitesse.
python-3.x
jit
Geai
la source
la source
Réponses:
Je ne sais pas pourquoi vous pensez qu'il n'y a pas d'implémentations Python qui se soucient des performances. PyPy , IronPython et Jython sont tous des implémentations Python de qualité industrielle, prêtes pour la production et soucieuses des performances. Pyston est une implémentation en cours de développement qui a été spécialement créée pour les performances. Unladen Swallow et Psyco étaient également des projets pour améliorer les performances de Python.
Cependant, le fait que les utilisateurs de CPython soient beaucoup plus nombreux que la base d'utilisateurs combinée totale de toutes les autres implémentations, que Unladen Swallow a été rejetée par la communauté, que la plupart de ces projets sont morts ou ont du mal à attirer les développeurs devrait vous dire quelque chose sur la façon dont Python la communauté valorise la performance.
Cette réponse est un bon exemple de la mentalité typique de la communauté Python: au lieu de résoudre les problèmes de performances, ils préfèrent simplement écrire leur code pas en Python.
Tout d'abord: peu importe la langue dans laquelle le compilateur est écrit. Après tout, le compilateur n'est exécuté qu'une seule fois , donc même s'il était lent, cela n'a pas d'importance: les performances du compilateur ne sont pas pertinentes, ce qui est pertinent est la performance de la sortie du compilateur.
En second lieu , car il importe que la rapidité de la sortie du compilateur est, et le compilateur est écrit en Python, à savoir la langue qu'il compile, il peut réellement faire lui - même rapidement par lui - même la compilation.
Troisièmement, il n’existe pas de «langage interprété». Une langue est un ensemble de règles et de restrictions mathématiques. C'est une spécification. Une feuille de papier. Une langue n'est ni compilée ni interprétée. Une langue est juste . La compilation et l'interprétation sont des traits d'une implémentation d'un langage , plus précisément, un compilateur ou un interprète (duh!), Pas le langage. Chaque langue peut être implémentée par un compilateur. Chaque langue peut être implémentée par un interprète. Vous pouvez générer mécaniquement un compilateur à partir d'un interpréteur et un interprète à partir d'un compilateur.
Mais tout cela n'a pas vraiment d'importance, car PyPy n'est pas écrit en Python. Il est écrit en RPython . RPython se compose de deux parties, le langage de programmation RPython et le cadre RPython.
Le langage de programmation RPython n'est pas Python. Il s'agit d'un langage de programmation différent. RPython est un langage de programmation de type statique, à peu près au même niveau sur l'abstraction que Java, avec à peu près les mêmes performances que C. RPython est un sous-ensemble syntaxique et sémantique de Python, ce qui signifie que chaque programme RPython est un programme Python valide et peut être exécuté par une implémentation Python (bien que généralement plusieurs ordres de grandeur plus lents, mais cela est toujours utile pour le débogage car vous avez accès à tous les outils de Python, et l'interprétation commence immédiatement, tandis que la compilation de l'implémentation du langage prend généralement environ 5 à 10 minutes ), mais l'inverse n'est pas vrai.
Le framework RPython est un framework pour écrire des implémentations de langage dynamique hautes performances dans le langage de programmation RPython. Il comprend un garbage collector, un espace objet, un protocole de méta-objet, des objets prédéfinis, des types et des opérations, etc. Mais le joyau de la couronne est sa capacité à générer automatiquement un compilateur JIT à partir d'un interpréteur: si vous implémentez un langage dans le framework RPython, vous n'avez qu'à écrire un interpréteur, le framework RPython s'occupe du JIT.
Il existe de nombreuses implémentations de langage sur la plate-forme RPython , pas seulement PyPy.
La plupart des implémentations de l'ISO CLI, telles que les différentes variantes .NET de Microsoft ou Mono, contiennent des récupérateurs de place, des optimiseurs et des compilateurs sophistiqués. Il en va de même pour les implémentations Jython et Java.
IronPython est un compilateur, il compile le code source Python en arborescences DLR (DLR est le Dynamic Language Runtime), qui sont ensuite compilés en code octet CIL, qui est ensuite à nouveau généralement compilé en code machine natif.
la source
JavaScript est inclus dans les navigateurs Web et une quantité importante de logiciels est aujourd'hui conçue pour fonctionner dans les navigateurs Web. Cela rend les performances JavaScript très importantes, ce qui fait que des entreprises comme Google, Apple et Microsoft investissent beaucoup de ressources pour accélérer l'exécution de JavaScript. Si ce flux d'argent avait été redirigé vers Python, ce serait tout aussi rapide.
L'idée est qu'une fois que le code est édité en JIT, il n'est plus "interprété". PyPI fonctionne en transformant le code Python en code machine (par exemple le code machine x86_64) qui est ensuite directement exécuté sur le processeur.
la source
Si vous structurez votre code python en modules avec un démarrage simple de premier niveau comme fichier python principal (avec très peu de code), alors python compile tout le reste de votre code en code octet indépendant de la machine, ce sont les Fichiers .pyc que vous voyez dans votre structure de répertoires. Cela minimise les temps de chargement et d'interprétation après la première exécution.
Si vous démarrez votre script avec les indicateurs -O ou -OO ou définissez PYTHONOPTIMIZE sur une valeur supérieure à 0, des fichiers .pyo sont générés et optimisés.
Si vous avez besoin d'une optimisation élevée pour certaines fonctions spécifiques, vous pouvez les écrire en C, C ++, FORTRAN ou GO, puis les utiliser à partir de python.
la source