Pourquoi Python n'a-t-il pas été optimisé comme les implémentations Javascript modernes?

11

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.

Geai
la source
2
IronPython - comme tout autre langage .NET - est compilé dans le "Common Intermediate Language" de Microsoft pour lequel il existe des implémentations de compilateur JIT très matures.
Doc Brown
2
Un langage de programmation est une spécification (écrite dans certains documents), pas un logiciel. Seules les implémentations de langage de programmation sont des logiciels (et peuvent être des compilateurs ou des interprètes).
Basile Starynkevitch
1
@BasileStarynkevitch: Je ne comprends pas ce que vous essayez de nous dire avec ce commentaire. L'OP pose des questions explicites sur CPython, PyPy et IronPython, qui sont des implémentations spécifiques de Python.
Doc Brown
1
@DocBrown Semble être un point pertinent à aborder, étant donné le dernier paragraphe de la question, qui montre un malentendu lorsqu'il appelle spécifiquement Python un langage interprété.
8bittree

Réponses:

19

Pourquoi Python n'en a-t-il pas?

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.

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.

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.

IronPython, même idée mais je ne vois pas comment le .NET Framework augmentera la vitesse.

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.

Jörg W Mittag
la source
6

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?

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.

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.

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.

el.pescado
la source
3
Particulièrement pertinent est que, dans le navigateur Web, il n'y a pas d'alternative à JavaScript (ou du moins, rien n'est généralement disponible sur tous les principaux navigateurs pour le moment). Si vous voulez des performances rapides dans le navigateur Web, vous devez avoir une implémentation JavaScript rapide. Alors que sur les plates-formes qui exécutent Python, vous pouvez presque certainement passer à un autre langage qui peut avoir une implémentation plus performante.
8bittree
-3

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.

Steve Barnes
la source
Comment intégrez-vous des extensions non-C dans Python? Je ne connais que les extensions C pour Cython.
1
@Bey: Fondamentalement, tout dans une bibliothèque partagée, (.dll ou .so), peut être appelé à partir de python à condition que vous connaissiez les signatures de fonction - celles-ci peuvent être configurées manuellement, générées par des outils tels que swing ou même générées à partir de la documentation doxygen. stackoverflow.com/questions/5811949/… est utile, tout comme blog.heroku.com/see_python_see_python_go_go_python_go
Steve Barnes