68 votes

Est-ce que python est plus lent que Java / C #?

Est-ce que python est plus lent que Java / C #?

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

Voici un projet qui optimise CPython: unladen-swallow

121voto

S.Lott Points 207588

Ne pas confondre Langue et de l'Exécution.

Python (langage) a de nombreux moment de l'exécution des implémentations.

  • Disponible est généralement interprété, et sera plus lent que le code natif en C#. Il pourrait être plus lente 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 est s'appuie sur la même .Bibliothèques NET et IL comme C#, donc la différence de rendement est relativement faible.

  • Python peut être traduit en code natif via PyREX, PyToC, et d'autres. Dans ce cas, il sera généralement effectuer ainsi que le C++. Vous pouvez -- à une mesure -- optimiser encore plus le C++ et peut-être prendre un peu de meilleures performances que unoptimized sortie du PyREX.

    Pour plus d'informations, voir http://arcriley.blogspot.com/2009/03/so-long-pyrex.html

Notez que Python (langage) n'est pas lent. Certains Python run-temps (Disponible, par exemple) sera plus lent que le code natif C++.

61voto

Il n'est pas vraiment correct de se demander pourquoi Python est plus lent que Java/C#. Quelle est la vitesse de Java? Eh bien, naïf interprètes sont environ dix fois plus lent que optimisés compilateurs. Je crois qu'il y est un Java bytcode interpréteur écrit en JavaScript qui n'est probablement pas très rapide. Donc, le but de la question semble être: "Pourquoi est Disponible en langue système plus lent que l'équivalent Sun, IBM et Oracle JRE et Microsoft .NET runtime?"

Je crois que la réponse est non techniques. La manière la plus rapide et Java .NET runtime sont plus rapides, car ils ont de grandes à temps plein technique des équipes de développement dans la performance de l'environnement concurrentiel.

Langage dynamique des systèmes faciles à mettre en œuvre. N'importe quel idiot peut le faire. J'ai. Statique de la langue systèmes sont plus complexes à concevoir et à mettre en œuvre. Un simple système statique aura tendance à fonctionner beaucoup plus rapide que son équivalent en juste-dynamique de travail équivalent. Toutefois, il est possible hautement optimisé dynamique des systèmes pour exécuter presque aussi vite. Je comprends que certaines Smalltalk mise en œuvre ont été très bonnes. Souvent citée en exemple de développé un système dynamique est la Machine Lisp du MIT.

De plus, si le réel grunt est fait par le code de la bibliothèque, puis le système de la langue ne peut pas d'importance. Sinon, la langue peut encourager (ou de donner l'heure(!)) pour développer des algorithmes plus efficaces qui peuvent facilement anéantir facteur constant différences de rendement.

38voto

wierob Points 2395

Comme mentionné dans les autres réponses, cela dépend du système d'exécution ainsi que la tâche à portée de main. Si la norme (C)Python n'est pas nécessairement plus lent que Java ou C#. Certains de ses modules sont mis en œuvre dans C. Ainsi, en combinant la vitesse d'un natif de la mise en œuvre avec Python langue.

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 a été fait destiné à évaluer les performances de précision arbitraire entiers implémentations.

testee. langue précision arbitraire entiers au moment de l'exécution

 1. Java java.les mathématiques.BigInteger JRE 6.13
 2. .NET Système.Numerics.BigInteger MS CLR 4.0
 3. Python longue et Active Python 2.6.2.2
 4. Bruit De Type BigInt Bruit 3.10.2
 5. .NET Mono.Les mathématiques.BigInteger MS CLR 4.0

résultats:

 1) 2) 3) 4) 5)
 10.000! 343 ms ms 137 91 1.200 ms ms ms 169
 20.000! 1.480 ms 569 ms 372 ms 1.457 ms ms 701
 30.000! 3.424 ms 1.243 ms 836 ms 3.360 ms ms 1.675
 40.000! 6.340 ms 2.101 ms 1.975 ms 6.738 ms ms 3.042
 50.000! 10.493 ms 3.763 ms 3.658 ms 10.019 ms ms 5.242
 60.000! 15.586 ms 7.683 ms 5.788 ms 14.241 ms 10.000 ms

alt text

Le diagramme à barres montre les résultats. Python est le gagnant clair. Comme je sais que Python utilise le Karatsuba-algorithme de multiplier les grands nombres entiers, ce qui explique la vitesse.

En outre, Python "précision arbitraire entiers"-type est le haut- long. Par conséquent, vous n'avez même pas besoin d'un type spécial de manutention qui est nécessaire pour Java BigInteger-classe.

15voto

Jon Skeet Points 692016

Comme suggéré dans les commentaires, vous devriez vraiment fournir un cas de test à raison d'environ. Raisons à l'origine de différences de performances varient en fonction de l'essai en cours d'exécution.

Cependant, je proposerais que la statique vs dynamique de la nature peut bien avoir beaucoup à faire avec elle. Pour les non-virtuel appels, le JIT-compilé en C#/Java est très bon marché puisqu'elle peut être déterminée avec précision au JIT-temps. Même les appels virtuels juste intervenir sur un seul niveau de la redirection. Lors de la liaison devient dynamique, il y a un large éventail de choses à considérer.

Je ne sais pas assez de détails sur Python pour prétendre comprendre l'exacte exécution de comportement, ce qui je pense peut varier en fonction de la version et de la mise en œuvre trop. Il ya une telle chose comme "python de byte code", qui est exécuté par une machine virtuelle - si cette machine virtuelle exécute réellement JIT-compilation ou pas est une autre question.

14voto

Dhananjay Nene Points 506

Elle se résume au fait que la phase de compilation a moins de travailler avec et d'où l'exécution doit faire plus de travail en cas de canard tapé (typées dynamiquement) langues.

Donc si je fais l'invocation de la méthode foo.bar(), dans le cas de Java ou en C++, l'invocation de la barre peut être optimisée dans le processus de compilation en découvrant le type de "foo", puis directement de l'invocation de la méthode à l'emplacement de 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 d'un compilateur python écrivain luttes avec, bien que l'un au-dessus, espérons-le adéquatement donne une indication. Donc, même avec le meilleur compilateur écrivains, les langages statiquement typés sont susceptibles de faire beaucoup mieux lors de l'exécution.

Où typées dynamiquement langues score sont généralement dans le temps de développement. En raison de moins de lignes de code à écrire et à maintenir, et pas de compiler les temps d'attente pour les développeurs, le développement passe souvent par beaucoup plus rapide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X