web-dev-qa-db-fra.com

L'interprète Python 3 possède-t-il une fonctionnalité JIT?

J'ai trouvé que lorsque 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 si on le compare à beaucoup d'autres langages interprétés, mais quand on le compare aux langues compilées, je pense que la différence est vraiment remarquable.

Il est possible d'accélérer les choses avec un compilateur Just In Time (JIT) dans 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 à celui-ci, si d'autres solutions sont disponibles, j'aimerais accepter de nouvelles réponses.

56
guz

Tout d'abord, Python 3(.x) est un langage, pour lequel il peut y avoir un certain nombre d'implémentations. D'accord, à ce jour, aucune implémentation sauf CPython implémente en fait ces versions du langage. Mais cela va changer (PyPy rattrape son retard).

Pour répondre à la question que vous vouliez poser: CPython, 3.x ou autre, ne contient, n'a jamais et ne contiendra probablement jamais de compilateur JIT. Certains autres Python (nativement PyPy, Jython et IronPython en réutilisant les compilateurs JIT pour les machines virtuelles sur lesquelles ils s'appuient) ont un compilateur JIT. Et il n'y a aucune raison pour que leurs compilateurs JIT s'arrêtent fonctionne quand ils ajoutent Python 3 support.

Mais pendant que je suis ici, permettez-moi également de répondre à 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 les frais généraux de l'interpréteur, ce qui explique une partie du ralentissement que vous voyez, mais pas la majorité. Un bon compilateur JIT effectue également un hôte d'optimisations qui supprime 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 caractéristiques introspectives.

L'implémentation du compilateur a n'aide pas à cela. Vous avez besoin d'optimisations très intelligentes, dont la plupart ne sont valables que dans des circonstances très spécifiques et pour une période de temps limitée. Les compilateurs JIT ont la tâche facile ici, car ils peuvent générer du code spécialisé au moment de l'exécution (c'est leur point principal), peuvent analyser le programme plus facilement (et plus précisément) en l'observant pendant son exécution et peuvent annuler les optimisations lorsqu'elles deviennent invalides. Ils peuvent également interagir avec les interprètes, contrairement aux compilateurs avancés, et le font souvent parce que c'est une décision de conception judicieuse. Je suppose que c'est pourquoi ils sont liés à des interprètes dans l'esprit des gens, bien qu'ils puissent exister et existent de manière indépendante.

Il existe également d'autres approches pour rendre l'implémentation de Python plus rapide, à part l'optimisation du code de l'interpréteur lui-même - par exemple, le projet HotPy (2). Mais celles-ci sont actuellement en phase de recherche ou d'expérimentation, et sont pour montrer leur efficacité (et maturité) par rapport au code réel.

Et bien sûr, les performances d'un programme spécifique dépendent beaucoup plus du programme lui-même que de l'implémentation du langage. L'implémentation du langage ne définit qu'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 les travaux inutiles, 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 vous gênez pas pour obtenir une implémentation plus rapide du langage. Il y a des applications qui sont irréalisables avec les frais généraux d'interprétation et de dynamique, mais elles ne sont pas aussi courantes que vous le pensez (et souvent, résolues en appelant sélectivement du code compilé par le code machine).

59
user395760

La seule implémentation Python qui a un JIT est PyPy . Byt - PyPy est à la fois une implémentation Python 2 et une Python 3.

14
Ngure Nyaga

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 prend pas en charge la syntaxe Python pour le moment).

8
rubik

Vous pouvez essayer la branche pypy py , qui est plus ou moins python compatible, mais l'implémentation officielle de CPython n'a pas de JIT).

5
lolopop

Cela sera mieux répondu par certains des développeurs remarquables Python sur ce site.

Je veux quand même commenter: Lorsque je discute de la vitesse des langages interprétés, j'aime juste pointer vers un projet hébergé chez cet emplacement: Computer Language Benchmarks Game

C'est un site dédié à l'exécution de benchmarks. Il y a des tâches spécifiques à faire. Tout le monde 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 examinées par des pairs, sont souvent améliorées par d'autres, et les résultats sont vérifiés par rapport aux spécifications. À long terme, il s'agit du système d'analyse comparative le plus équitable pour comparer différentes langues.

Comme vous pouvez le voir dans résumés indicatifs comme celui-ci , les langues compilées sont assez rapides par rapport aux langues interprétées. 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 sur Les types peuvent être modifiés à la volée. Une vérification de type doit donc être reportée à l'exécution, au lieu du temps de compilation.

Ainsi, bien que vous puissiez discuter des avantages du compilateur, vous devez tenir compte du fait qu'il existe différentes fonctionnalités dans différentes langues. Et ces caractéristiques peuvent avoir un prix intrinsèque.

Enfin, lorsque l'on parle de vitesse: le plus souvent, ce n'est pas la langue et la lenteur perçue d'une langue qui causent le problème, c'est un mauvais algorithme. Je n'ai jamais eu à changer de langue car une était trop lente: Quand il y a un problème de vitesse dans mon code, je corrige l'algorithme. Cependant, s'il y a des boucles longues et gourmandes en calcul dans votre code, cela vaut généralement la peine de les recompiler. Un exemple important est les bibliothèques codées en C utilisées par les langages de script (bibliothèques Perl XS, ou par exemple numpy/scipy pour Python, lapack/blas sont des exemples de bibliothèques disponibles avec des liaisons pour de nombreux langages de script)

3
cfi

Si vous voulez dire JIT comme dans le compilateur Just in time vers une représentation Bytecode alors il a une telle fonctionnalité (depuis 2.2). Si vous voulez dire JIT au code machine, alors non. Pourtant, la compilation en code octet offre beaucoup d'amélioration des performances. Si vous voulez qu'il compile en code machine, alors Pypy est l'implémentation que vous recherchez.

Remarque: pypy ne fonctionne pas avec Python 3.x

1
Aniket Inge

Si vous recherchez des améliorations de vitesse dans un bloc de code, alors vous voudrez peut-être jeter un œil à rpythonic , qui se compile en C en utilisant pypy. Il utilise un décorateur qui le convertit en JIT pour Python.

0
jdavid_1385