Python est-il plus lent que Java/C#? [fermé]

est-ce que Python est plus lent que Java / C#?

performance-comparaison-c-java-python-ruby-python-jruby-groovy

voici un projet qui optimise CPython: hirondelle à vide

64
demandé sur informatik01 2009-03-23 13:26:13

13 réponses

ne conflate pas le langage et le temps de fonctionnement.

Python (le langage) a 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 Java JIT.

  • JYthon est interprété dans la JVM et a le même profil de performance que Java.

  • IronPython s'appuie sur les mêmes bibliothèques.net et IL que C#, de sorte que la différence de performance sera relativement faible.

  • Python peut être traduit en code natif via PyREX, PyToC, et autres. Dans ce cas, il fonctionne généralement aussi bien que C++. Vous pouvez, dans une certaine mesure, optimiser davantage le C++ et peut-être obtenir de meilleures performances que la sortie non optimisée de PyREX.

    pour plus d'information, 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 C++en code natif.

117
répondu S.Lott 2017-08-29 10:21:29

il n'est pas vraiment correct de demander pourquoi Python est plus lent que Java/C#. Quelle est la vitesse de Java? Les interprètes naïfs sont environ dix fois plus lents que les compilateurs optimisés. Je crois qu'il y a un interpréteur Java bytcode écrit en JavaScript - ce qui n'est probablement pas très rapide. Ainsi, la question semble être "pourquoi le système de langage CPython est-il plus lent que L'équivalent Sun, IBM et Oracle JRE et Microsoft. NET runtime?"

je crois que la bonne réponse est non-technique. Les temps D'exécution Java et .NET les plus rapides sont plus rapides parce qu'ils disposent de grandes équipes techniques à temps plein qui les développent dans un environnement compétitif en termes de performances.

les systèmes de langage dynamique sont faciles à mettre en œuvre. N'importe quel idiot peut le faire. J'ai. Les systèmes linguistiques statiques sont plus complexes à concevoir et à mettre en œuvre. Un système statique simple aura tendance à fonctionner beaucoup plus rapidement que l'équivalent dynamique de travail équivalent. Cependant, il est possible d'optimiser fortement la dynamique les systèmes fonctionnent presque aussi vite. J'ai cru comprendre qu'une implémentation Smalltalk était assez bonne. Un exemple souvent cité d'un système dynamique développé est le MIT Lisp Machine .

de plus si le vrai grognement se fait par code de bibliothèque, alors le système de langue peut ne pas avoir d'importance. La langue peut aussi encourager (ou donner du temps(!)) pour développer des algorithmes plus efficaces qui peuvent facilement effacer les différences constantes de performance des facteurs.

55
répondu Tom Hawtin - tackline 2009-03-23 11:30:48

comme indiqué dans les autres réponses, cela dépend du système d'exécution ainsi que de la tâche à accomplir. Donc le standard (C)Python 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'une implémentation native avec le langage de Python.

Nous avons fait une petite expérience: Nous avons comparé les temps d'exécution d'un calcul Factoriel dans différentes langues. Le test était en fait destiné à: évaluer la performance des implémentations d'entiers de précision arbitraire.

testee. language arbitrary-precision integers run-time

     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

results:

                 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

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

Le diagramme à barres montre les résultats. Python est le vainqueur. Pour autant que je sache Python utilise le karatsuba-algorithme pour multiplier les grands entiers, ce qui explique la vitesse.

de plus, le type"arbitraire-precision integers "de Python est le long intégré . Par conséquent, vous n'avez même pas besoin de la manipulation de type spéciale qui est requise pour la classe BigInteger de Java.

38
répondu wierob 2009-09-24 12:43:08

Simplement Python est lent .

quel que soit l'interpréteur (actuellement disponible) que vous utilisez, il est plus lent que Java et C. dans différents benchmarks, il est plus lent que Ruby et PHP. Ne vous fiez pas aux réponses des autres, cochez 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 pensez, il y a beaucoup de contribution sérieuse et de développement fait sur Obtenir python plus rapidement. Puisque la productivité est bonne en python et qu'elle résout certains problèmes directement, la vitesse/performance n'est pas prise au sérieux. Il y a aussi des problèmes d'architecture qui empêchent Python de modifier ses performances.

Disclaimer - cette réponse nuira probablement aux amoureux de Python. Je suis aussi développeur Python, j'adore développer des webapps en Django/Flask / Pyramid plutôt que le printemps (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 suis d'accord avec eux, qui dit que L'interprète Python devrait se huiler et graisser ou changer complètement de moteur pour au moins se tenir en marathon. C'est l'un des principaux langage de programmation.

22
répondu Ravi Kumar 2013-07-22 15:08:47

comme suggéré dans les commentaires, vous devriez vraiment fournir un cas type à raisonner. Les raisons derrière les différences de performance changeront selon le test en cours d'exécution.

cependant, je dirais que la nature statique vs dynamique pourrait bien avoir beaucoup à voir avec elle. 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 à JIT-time. Même les appels virtuels n'impliquent qu'un seul niveau de redirection. Lors de la liaison devient dynamique, il y a un large éventail de choses à considérer.

Je ne connais pas assez de détails sur Python pour prétendre comprendre son comportement d'exécution exact, que je soupçonne peut varier avec la version et l'implémentation aussi. Il existe une sorte de "code d'octet python" qui est ensuite exécuté par une machine virtuelle - que cette machine virtuelle exécute effectivement une compilation JIT ou non est une autre question.

15
répondu Jon Skeet 2009-03-23 10:30:51

cela se résume au fait que la phase de compilation dispose de moins d'informations pour fonctionner et que le runtime doit donc faire plus de travail en cas de langues dactylographiées (dynamiquement dactylographiées).

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 en invoquant directement la méthode à l'emplacement de la mémoire où le compilateur sait qu'il va être trouvé. Depuis un python ou tout autre typées dynamiquement compilateur de langage ne connaissez pas le type de l'objet foo appartient, il doit faire une vérification de type à l'exécution, puis rechercher l'adresse de la méthode de barre, puis l'appeler.

il y a d'autres difficultés avec lesquelles un compilateur python se bat aussi, bien que celle ci-dessus donne, espérons-le, une indication adéquate. Donc, même avec le meilleur compilateur écrivains, les langages statiquement typés sont susceptibles de faire beaucoup mieux au moment de l'exécution.

où le score de langues dactylographiées dynamiquement est typiquement dans le temps de développement. En raison de la réduction du nombre de lignes de code à écrire et à tenir à jour, et de l'absence de temps d'attente pour la compilation des développeurs, le développement est souvent beaucoup plus rapide.

14
répondu Dhananjay Nene 2009-03-23 12:19:45

Ce que vous avez, il est clair exemple de l'écriture de 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 pythonique:

 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
répondu vartec 2009-03-23 11:47:26

je pense que C'est finalement que Python ne va pas aussi loin que possible avec des optimisations. La plupart des techniques d'optimisation courantes sont pour les langages statiques. Il sont techniques d'optimisation pour les langues dynamiques, mais les modernes ne semblent pas en faire autant usage qu'ils pourraient. Steve Yegge a un excellent billet de blog sur le sujet .

EDIT : je voulais juste faites remarquer que je n'affirme pas nécessairement que C'est critique envers Python. Je préfère la simplicité à la vitesse inutile.

6
répondu Jason Baker 2009-04-26 21:37:00

cela n'a rien à voir avec les langues elles-mêmes, c'est juste le fait que java implémentation et runtime system (JVM) sont de très haute qualité, et que beaucoup de ressources ont été investies dans la stabilité, l'évolutivité et l'amélioration des performances au fil des ans.

contraste avec le fait que la mise en œuvre de CPython tout récemment mis en œuvre par exemple threaded dispatch dans son interprète qui lui a donné augmentation des 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 genre d'optimisation de base devrait être là dès le premier jour.

5
répondu Marko 2015-09-30 22:10:27

Ce type de question ne peut être répondu simplement par le raisonnement qualitatif, vous avez besoin de bons repères. Voici un jeu qui compare Python 3 vs C# Mono et trouve que Python est de 3 à 300 fois plus lent. Les résultats Python vs. Java sont similaires. (Les précautions habituelles concernant l'interprétation des points de repère s'appliquent.)

ces benchmarks indiquent aussi la taille du code source, et Python était significativement plus concis que Java et C#.

3
répondu Jim Ferrans 2009-07-22 12:58:01

je pense à l'opposé. Je peux faire un programme simple en Python plus rapidement qu'en Java, et ces scripts Python fonctionnent très vite.

bien sûr, votre question sans exemples est difficile à répondre. Vous avez peut-être trouvé une bibliothèque lente, un bug, etc. Nous donner plus de détails s'il vous plaît.

1
répondu Michał Niklas 2009-03-23 10:33:41

je dirais que la facilité et la simplicité d'écrire du code Python permet d'écrire du code plus complexe; par exemple, du code qui tire profit des processeurs multi-core. Étant donné que la performance per-core a été la plupart du temps stagnante au cours des 5 à 10 dernières années, je ne pense pas qu'il soit clair que les programmes Python (qu'ils tournent sur CPython ou autre chose) sont plus lents à long terme.

1
répondu DNS 2009-03-23 13:04:06

Puisqu'il est interprété et non compilé.. il devrait être plus lente dans le temps d'exécution.

comme un tableau mentionné dans Code complet (Deuxième Édition) Livre, page 600,

C # égale c++ dans exécution time (1:1). Et Python est plus lent que cent fois que C++ dans le temps d'exécution (>100:1).

et Java est plus lent que C++ d'une fois et demie (De 1,5:1).

Ces statistiques sont, en moyenne. Je ne sais pas qui a fait cette étude, mais ça semble intéressant.

1
répondu Saleh Al-Zaid 2009-04-26 16:55:02