web-dev-qa-db-fra.com

Python plus lent que Java / C #?

Python plus lent que Java/C #?

comparaison-performances-c-Java-python-Ruby-jython-jruby-groovy

Voici un projet qui optimise CPython: nladen-swallow

67
yesraaj

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++).

121
S.Lott

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.

59

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 

texte alternatif http://www.mycsharp.de/wbb2/attachment.php?attachmentid=6909&sid=0d5aa62b522d005d9e7089785b5d19f1

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.

37
wierob

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.

http://benchmarksgame.alioth.debian.org/u64q/benchmark.php?test=all&lang=python3&lang2=Java&data=u64q

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.

25
Ravi Kumar

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.

15
Jon Skeet

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.

14
Dhananjay Nene

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
9
vartec

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.

6
Jason Baker

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.

5
Marko

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 #.

3
Jim Ferrans

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.

2
Saleh Al-Zaid

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.

1
DNS

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.

1
Michał Niklas