L'interpréteur Python 3 a - t-il une fonctionnalité JIT?
J'ai trouvé que quand je demande quelque chose de plus à Python, python n'utilise pas ma ressource machine à 100% et ce n'est pas vraiment rapide, c'est rapide par rapport à beaucoup d'autres langages interprétés, mais par rapport aux langages compilés, je pense que la différence est vraiment remarquable.
Il est possible d'accélérer les choses avec un compilateur juste à temps (JIT) en Python 3 ?
Habituellement, un compilateur JIT est la seule chose qui peut améliorer les performances dans les langages interprétés, donc je fais référence pour celui-ci, si d'autres solutions sont disponibles, j'aimerais accepter de nouvelles réponses.
7 réponses
Tout d'abord, Python 3(.x) est un langage, pour lequel il peut y avoir n'importe quel nombre d'implémentations. OK, à ce jour aucune implémentation sauf CPython implémente réellement ces versions du langage. Mais cela va changer (PyPy rattrape).
Pour répondre à la question que vous vouliez poser: CPython, 3.x ou autrement, ne contient pas, ne l'a jamais fait et ne le fera probablement jamais, un compilateur JIT. Quelques autres implémentations Python (PyPy nativement, Jython et IronPython en réutilisant les compilateurs JIT pour les machines virtuelles sur lesquelles ils construisent) ont un compilateur JIT. Et il n'y a aucune raison pour que leurs compilateurs JIT cessent de fonctionner lorsqu'ils ajoutent le support Python 3.
Mais pendant que je suis ici, laissez-moi aussi aborder une idée fausse:
Habituellement, un compilateur JIT est la seule chose qui peut améliorer les performances dans les langages interprétés
Ce n'est pas correct. Un compilateur JIT, dans sa forme la plus basique, supprime simplement la surcharge de l'interpréteur, ce qui explique en partie le ralentissement que vous avez voir, mais pas pour la majorité. Un compilateurBon JIT effectue également une foule d'optimisations qui suppriment la surcharge nécessaire pour implémenter de nombreuses fonctionnalités Python en général (en détectant des cas spéciaux qui permettent une implémentation plus efficace), des exemples importants étant le typage dynamique, le polymorphisme et diverses fonctionnalités introspectives.
Implémenter simplement un compilateur n'aide pas avec cela. Vous avez besoin d'optimisations très intelligentes, dont la plupart ne sont valables que dans très circonstances particulières et pour une période limitée. Les compilateurs JIT l'ont facilement ici, car ils peuvent générer du code spécialisé au moment de l'exécution (c'est tout leur point), peuvent analyser le programme plus facilement (et plus précisément) en l'observant au fur et à mesure qu'il s'exécute, et peuvent annuler les optimisations lorsqu'elles deviennent invalides. Ils peuvent également interagir avec les interprètes, contrairement aux compilateurs à l'avance, et le font souvent parce que c'est une décision de conception sensée. Je suppose que c'est pourquoi ils sont liés à des interprètes dans les les esprits, bien qu'ils puissent et existent indépendamment.
Il existe également d'autres approches pour accélérer L'implémentation de Python, en dehors de l'optimisation du code de l'interpréteur lui - même-par exemple, le projet HotPy (2). Mais ceux-ci sont actuellement en phase de recherche ou d'expérimentation, et n'ont pas encore montré leur efficacité (et leur maturité) par rapport au code réel.
Et bien sûr, la performance d'un programme spécifique dépend beaucoup plus du programme lui-même que de l'implémentation du langage. Le l'implémentation du langage définit uniquement une limite supérieure pour la vitesse à laquelle vous pouvez effectuer une séquence d'opérations. Généralement, vous pouvez améliorer les performances du programme beaucoup mieux simplement en évitant le travail inutile, c'est-à-dire en optimisant le programme. Cela est vrai que vous exécutiez le programme via un interpréteur, un compilateur JIT ou un compilateur à l'avance. Si vous voulez que quelque chose soit rapide, ne sortez pas de votre chemin pour obtenir une implémentation de langage plus rapide. Il y a des applications qui sont infaisable avec les frais généraux d'interprétation et de dynamisme, mais ils ne sont pas aussi communs que vous le pensez (et souvent, résolus en appelant sélectivement du code compilé par code machine).
La seule implémentation Python qui a un JIT est PyPy . Byt-PyPy est une implémentation Python 2, pas une implémentation Python 3. Vous pouvez prendre en charge le port Python 3.
Le projet Numba devrait fonctionner sur Python 3. Bien que ce ne soit pas exactement ce que vous avez demandé, Vous pouvez essayer: https://github.com/numba/numba/blob/master/docs/source/doc/userguide.rst.
Il ne supporte pas toute la syntaxe Python pour le moment.
Cela sera mieux répondu par certains des développeurs Python remarquables sur ce site.
Encore je veux commenter: en discutant de la vitesse des langues interprétées, j'aime juste pointer vers un projet hébergé à cet endroit: Computer Language Benchmarks Game
C'est un site dédié à l'exécution de tests. Il y a des tâches spécifiées à faire. N'importe qui peut soumettre une solution dans sa langue préférée, puis les tests comparent le temps d'exécution de chaque solution. Les Solutions peuvent être évaluées par des pairs, sont souvent améliorées par d'autres, et les résultats sont vérifiés par rapport à la spécification. À long terme, c'est le système de benchmarking le plus juste pour comparer différentes langues.
Comme vous pouvez le voir à partir de résumés indicatifs comme celui-ci, les langages compilés sont assez rapides par rapport aux langages interprétés. Cependant, la différence n'est probablement pas tellement dans le type exact de compilation, c'est le fait que Python (et les autres dans le graphique plus lent que python) sont entièrement dynamiques. Les objets peuvent être modifiés à la volée. Les Types peuvent être modifiés à la volée. Donc, une vérification de type doit être reportée à l'exécution, au lieu de la compilation.
Donc, alors que vous pouvez discuter des avantages du compilateur, vous devez prendre en compte qu'il existe différentes fonctionnalités dans différentes langues. Et ces caractéristiques peuvent avoir un prix intrinsèque.
Enfin, quand on parle de vitesse: le plus souvent ce n'est pas la langue et la lenteur perçue d'une langue c'est à l'origine du problème, c'est un mauvais algorithme. Je n'ai jamais eu à changer de langue car on était trop lent: quand il y a un problème de vitesse dans mon code, je corrige l'algorithme. Cependant, s'il y a des boucles intensives de calcul chronophages dans votre code, vaut généralement la peine de les recompiler. Un exemple important sont les bibliothèques codées en C utilisées par les langages de script (libs Perl Xs, ou par exemple numpy / scipy pour Python, lapack / blas sont des exemples de libs disponibles avec des liaisons pour beaucoup langages de script)
Si vous voulez dire JIT comme dans le compilateur juste à temps à une représentation Bytecode alors il a une telle fonctionnalité (depuis 2.2). Si vous voulez dire JIT au code machine, alors non. Pourtant, le code de compilation en octet offre beaucoup d'amélioration des performances. Si vous voulez qu'il soit compilé en code machine, Pypy est l'implémentation que vous recherchez.
Note: pypy ne fonctionne pas avec Python 3.x
Si vous cherchez des améliorations de vitesse dans un bloc de code, alors vous voudrez peut-être jeter un oeil à rpythonic, qui compile en C en utilisant pypy. Il utilise un décorateur qui le convertit en JIT pour Python.