Tout d'abord, Python 3(.x) est un langage, pour lequel il peut y avoir un nombre illimité d'implémentations. Bon, à ce jour, aucune implémentation à l'exception de CPython n'implémente réellement ces versions du langage. Mais cela va changer (PyPy est en train de rattraper son retard).
Pour répondre à la question que vous vouliez poser : CPython, 3.x ou autre, ne contient pas, n'a jamais contenu et ne contiendra probablement jamais un compilateur JIT. D'autres implémentations de Python (PyPy nativement, Jython et IronPython en réutilisant des compilateurs JIT pour les machines virtuelles sur lesquelles ils sont construits) ont un compilateur JIT. Et il n'y a aucune raison pour que leurs compilateurs JIT cessent de fonctionner lorsqu'ils ajouteront le support de Python 3.
Mais tant que je suis là, laissez-moi aussi répondre à une idée fausse :
En général, 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 une partie du ralentissement que vous constatez, mais pas la majorité. A bon Le compilateur JIT effectue également une série d'optimisations qui suppriment la surcharge nécessaire à l'implémentation de nombreuses fonctionnalités de Python en général (en détectant les cas particuliers qui permettent une implémentation plus efficace), les exemples les plus importants étant le typage dynamique, le polymorphisme et diverses fonctionnalités introspectives.
Il suffit de mettre en œuvre a Le compilateur n'y contribue pas. Vous avez besoin d'optimisations très astucieuses, dont la plupart ne sont valables que dans des circonstances très spécifiques et pour une fenêtre de temps limitée. Les compilateurs JIT ont la vie facile ici, car ils peuvent générer du code spécialisé au moment de l'exécution (c'est tout leur intérêt), 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 ahead of time, et le font souvent parce que c'est une décision de conception judicieuse. Je suppose que c'est la raison pour laquelle ils sont liés aux interprètes dans l'esprit des gens, bien qu'ils puissent exister indépendamment.
Il existe également d'autres approches pour rendre l'implémentation de Python plus rapide, en dehors de l'optimisation du code de l'interpréteur lui-même - par exemple, le projet HotPy (2). Mais ces approches sont actuellement au stade de la recherche ou de l'expérimentation, et doivent encore montrer leur efficacité (et leur maturité) par rapport au code réel.
Et bien sûr, les performances d'un programme spécifique dépendent du programme lui-même bien plus que de l'implémentation du langage. L'implémentation du langage ne fait que fixer une limite supérieure à la vitesse à laquelle vous pouvez effectuer une séquence d'opérations. En général, vous pouvez améliorer les performances d'un programme en évitant tout travail inutile, c'est-à-dire en optimisant le programme. Cela est vrai indépendamment du fait que vous exécutiez le programme par le biais d'un interprète, d'un compilateur JIT ou d'un compilateur en avance sur le temps. Si vous voulez que quelque chose soit rapide, ne faites pas d'efforts pour obtenir une implémentation plus rapide du langage. Il existe des applications qui ne sont pas réalisables avec les frais d'interprétation et de dynamisme, mais elles ne sont pas aussi courantes que vous le pensez (et souvent, elles sont résolues en faisant appel au code machine compilé de manière sélective).