Python plus lent que Java/C #?
comparaison-performances-c-Java-python-Ruby-jython-jruby-groovy
Voici un projet qui optimise CPython: nladen-swallow
Ne confondez pas la langue et l'exécution.
Python (le langage) possède de nombreuses implémentations d'exécution.
CPython est généralement interprété et sera plus lent que le code natif C #. Il peut être plus lent que Java, selon le compilateur JIT Java.
JYthon est interprété dans la JVM et a le même profil de performances que Java.
IronPython s'appuie sur les mêmes bibliothèques .NET et IL que C #, de sorte que la différence de performances sera relativement faible.
Python peut être traduit en code natif via PyREX, PyToC et autres. Dans ce cas, il fonctionnera généralement aussi bien que C++. Vous pouvez - dans une certaine mesure - optimiser davantage C++ et peut-être obtenir des performances un peu meilleures que la sortie non optimisée de PyREX.
Pour plus d'informations, voir http://arcriley.blogspot.com/2009/03/so-long-pyrex.html
Notez que Python (le langage) n'est pas lent. Certains temps d'exécution Python (CPython, par exemple) seront plus lents que le code natif C++).
Il n'est pas vraiment correct de demander pourquoi Python est plus lent que Java/C #. Quelle est la vitesse de Java? Eh bien, les interprètes naïfs sont environ dix fois plus lents que les compilateurs optimisés. Je crois qu'il existe un interprète de bytcode Java écrit en JavaScript - qui n'est probablement pas très rapide. Ainsi, la question envisagée semble être "Pourquoi le système de langage CPython est-il plus lent que le runtime équivalent Sun, IBM et Oracle JRE et Microsoft .NET?
Je pense que la bonne réponse n'est pas technique. Les temps d'exécution Java et .NET les plus rapides sont plus rapides car ils disposent de grandes équipes techniques à plein temps qui les développent dans un environnement compétitif.
Les systèmes linguistiques dynamiques sont faciles à mettre en œuvre. N'importe quel idiot peut le faire. J'ai. Les systèmes de langage statique sont plus complexes à concevoir et à mettre en œuvre. Un système statique simple aura tendance à fonctionner beaucoup plus rapidement que l’équivalent dynamique juste fonctionnel équivalent. Cependant, il est possible que les systèmes dynamiques hautement optimisés fonctionnent presque aussi rapidement. Je comprends que la mise en œuvre de Smalltalk était assez bonne. Un exemple souvent cité d'un système dynamique développé est le MIT LISP Machine .
De plus, si le véritable grognement est effectué par le code de la bibliothèque, le système linguistique peut ne pas avoir d'importance. Alternativement, le langage peut encourager (ou donner du temps (!)) À développer des algorithmes plus efficaces qui peuvent facilement effacer les différences constantes de performances des facteurs.
Comme mentionné dans les autres réponses, cela dépend du système d'exécution ainsi que de la tâche à accomplir. Ainsi, le Python standard (C) n'est pas nécessairement plus lent que Java ou C #. Certains de ses modules sont implémentés en C. Combinant ainsi la vitesse d'un natif implémentation avec le langage Python.
Nous avons fait une petite expérience: nous avons comparé le temps d'exécution d'un calcul factoriel dans différentes langues. Le test était en fait destiné à évaluer les performances des implémentations d'entiers de précision arbitraire.
testée. langage entiers de précision arbitraire au moment de l'exécution 1. Java Java.math.BigInteger JRE 6.13 2. .NET System.Numerics. BigInteger MS CLR 4.0 3. Python long Active Python 2.6.2.2 4. Squeak BigInt Squeak 3.10.2 5. .NET Mono.Math.BigInteger MS CLR 4.0 Résultats: 1) 2) 3) 4) 5) 10 000! 343 ms 137 ms 91 ms 1.200 ms 169 ms 20.000! 1.480 ms 569 ms 372 ms 1.457 ms 701 ms 30.000! 3,424 ms 1,243 ms 836 ms 3,360 ms 1,675 ms 40,000! 6.340 ms 2.101 ms 1.975 ms 6.738 ms 3.042 ms 50.000! 10.493 ms 3.763 ms 3.658 ms 10.019 ms 5.242 ms 60.000! 15,586 ms 7,683 ms 5,788 ms 14,241 ms 10 000 ms
Le graphique à barres montre les résultats. Python est le gagnant clair. Pour autant que je sache Python utilise le Karatsuba-algorithme pour multiplier les grands nombres entiers, ce qui explique la la vitesse.
De plus, le type "entiers de précision arbitraire" de Python est le long
intégré. Par conséquent, vous n'avez même pas besoin d'une gestion de type spéciale qui est requise pour la classe BigInteger de Java.
Simplement - Python est lent .
Quel que soit l'interpréteur (actuellement disponible) que vous utilisez, il est plus lent que Java et C. Dans divers cas-tests, il est plus lent que Ruby et PHP. Ne pas dépendez des réponses des autres, vérifiez et vérifiez vous-même.
Personnellement, je ne pense pas, il y a beaucoup de contribution et de développement sérieux pour obtenir python plus rapide. Puisque la productivité est bonne dans python et cela résout certains problèmes) simple, la vitesse/les performances ne sont pas prises au sérieux. Il y a aussi des problèmes d'architecture empêchant Python d'obtenir des réglages de performances.
Clause de non-responsabilité - Cette réponse blessera probablement Python amoureux. Moi aussi, je suis Python développeur, adore développer des applications web dans Django/Flask/Pyramid plutôt que Spring (Java). Mais je vois pratiquement dans mon travail et mon expérience, comment Python est plus lent. La vitesse n'est pas toujours ma priorité. Mais je reste avec eux, qui dit Python L'interprète devrait se faire huiler et graisser ou changer complètement de moteur pour au moins se tenir au marathon. C'est un langage de programmation traditionnel.
Comme suggéré dans les commentaires, vous devez vraiment fournir un cas de test pour expliquer. Les raisons des différences de performances varient en fonction du test exécuté.
Cependant, je suggère que la nature statique vs dynamique pourrait bien y être pour beaucoup. Pour les appels non virtuels, le C #/Java compilé par JIT est extrêmement bon marché car il peut être déterminé avec précision au moment JIT. Même les appels virtuels impliquent un seul niveau de redirection. Lorsque la liaison devient dynamique, il y a un plus large éventail de choses à considérer.
Je ne connais pas suffisamment de détails sur Python pour prétendre comprendre son comportement d'exécution exact, ce qui, je le soupçonne, peut également varier en fonction de la version et de l'implémentation. Il existe un "code d'octet python" qui est ensuite exécuté par une machine virtuelle - que cette machine virtuelle effectue ou non la compilation JIT est une autre affaire.
Cela se résume au fait que la phase de compilation a moins d'informations à travailler et donc le runtime doit faire plus de travail dans le cas de langues de type canard (typées dynamiquement).
Ainsi, si je fais l'invocation de la méthode foo.bar (), dans le cas de Java ou C++, l'invocation à bar peut être optimisée dans le processus de compilation en découvrant le type de "foo" puis invoquer directement la méthode à l'emplacement de mémoire où le compilateur sait qu'elle sera trouvée. Puisqu'un python ou tout autre compilateur de langage à typage dynamique ne sait pas à quel type l'objet foo appartient, il doit effectuez une vérification de type lors de l'exécution, puis recherchez l'adresse de la méthode bar, puis invoquez-la.
Il y a d'autres difficultés avec lesquelles un écrivain de compilateur python a du mal, bien que celui ci-dessus donne une indication adéquate. Donc, même avec les meilleurs écrivains de compilateur, les langages à typage statique sont susceptibles de fonctionner beaucoup mieux à exécution.
Le score des langues typées dynamiquement se situe généralement dans le temps de développement. En raison de moins de lignes de code à écrire et à maintenir, et pas de temps d'attente de compilation pour les développeurs, le développement passe souvent beaucoup plus vite.
Ce que vous avez là est un exemple clair d'écriture Java en Python:
def __init__(self,size):
self.first = None
last = None
for i in range(size):
current = Person(i)
if self.first == None : self.first = current
if last != None :
last.next = current
current.prev = last
last = current
self.first.prev = last
last.next = self.first
Un peu plus Pythonic:
def __init__(self,size):
chain = [Person(i) for i in range(size)]
self.first = chain[0]
chain = Zip(chain, chain[1:].append(chain[0]))
for p,n in chain:
p.next = n
n.prev = p
Je pense que c'est finalement que Python ne va pas aussi loin qu'il peut avec les optimisations. La plupart des techniques d'optimisation qui sont courantes sont pour les langages statiques. Il y a sont = techniques d'optimisation pour les langages dynamiques, mais les modernes ne semblent pas en faire autant usage qu'ils le pourraient. Steve Yegge a un excellent article de blog sur le sujet .
[~ # ~] edit [~ # ~] : Je voulais juste souligner que je ne dis pas nécessairement que c'est critique envers Python. Je préfère la simplicité à la vitesse inutile tous les jours.
Cela n'a rien à voir avec les langues elles-mêmes, c'est juste le fait que Java implémentation et système d'exécution (JVM) sont très haute qualité, et que de nombreuses ressources ont été investies dans la stabilité, l'évolutivité et l'amélioration des performances au fil des ans.
Cela contraste avec le fait que l'implémentation de CPython a récemment été implémentée, par exemple, la répartition filetée dans son interprète, ce qui lui a permis d'augmenter les performances jusqu'à 20% pour certains problèmes. Ce n'est pas une bonne chose que cela puisse paraître, c'est mauvais parce que ce type d'optimisation de base devrait être là dès le premier jour.
Ce type de question ne peut pas être répondu simplement par un raisonnement qualitatif, vous avez besoin de bons repères pour le sauvegarder. Voici un ensemble qui compare Python 3 vs C # Mono et trouve Python pour être 3 à 300 fois plus lent. Le Python contre Java les résultats sont similaires. (Les précautions habituelles concernant l'interprétation des benchmarks s'appliquent.)
Ces tests indiquent également la taille du code source et Python était beaucoup plus concis que Java et C #.
Puisqu'il est interprété et non compilé .. il devrait être plus lent en temps d'exécution.
Comme un tableau mentionné dans Code Complete (deuxième édition) livre, page 600,
C # est égal à C++ en temps d'exécution (1: 1). Et Python est plus lent au-dessus de cent fois que C++ en temps d'exécution (> 100: 1).
Et Java est plus lent que C++ d'une fois et demie (1.5: 1).
Ces statistiques sont en moyenne. Je ne sais pas qui a fait cette étude, mais cela semble intéressant.
Je dirais que la facilité et la simplicité de l'écriture Python permet d'écrire du code plus complexe; par exemple, du code qui tire parti des processeurs multicœurs. Depuis les performances par cœur ont été stagnant principalement au cours des 5 à 10 dernières années, je ne pense pas qu'il soit clair que les programmes Python (qu'ils s'exécutent sur CPython ou autre)) soient plus lents à long terme.
Je pense en face. Je peux faire un programme simple en Python plus rapide qu'en Java, et ces scripts Python fonctionnent très rapidement).
Bien sûr, il est difficile de répondre à votre question sans exemples. Peut-être avez-vous trouvé une bibliothèque lente, un bug, etc. Donnez-nous plus de détails s'il vous plaît.