web-dev-qa-db-fra.com

Pourquoi est Python plus lent que Java mais plus rapide que PHP

J'ai vu à plusieurs reprises divers repères qui montrent comment un tas de langues fonctionnent sur une tâche donnée.

Ces benchmarks révèlent toujours que Python est plus lent que Java et plus rapide que PHP, et je me demande pourquoi c'est le cas.

  • Java, Python et PHP exécuté dans une machine virtuelle
  • Les trois langues convertissent leurs programmes en codes d'octets personnalisés qui exécutent au-dessus du système d'exploitation - donc aucun ne s'exécute en mode natif
  • Les deux Java et Python peut être "compilé" (.pyc pour Python) mais le __main__ module pour Python n'est pas compilé

Python et PHP sont typés dynamiquement, et Java statiquement - est-ce la raison Java est plus rapide, et si c'est le cas) , veuillez expliquer comment cela affecte la vitesse.

Et, même si l'argument dynamique-vs-statique est correct, cela n'explique pas pourquoi PHP est plus lent que Python - car les deux sont des langages dynamiques.

Vous pouvez voir quelques repères ici et ici , et ici

18
treecoder

Le code JVM peut être compilé JIT efficacement, en utilisant un compilateur ad hoc trivial (et rapide). Mais la même chose serait exceptionnellement difficile pour PHP et Python, en raison de leur nature typée dynamiquement. JVM se traduit par un code natif assez bas et simple, assez similaire à ce que produirait un compilateur C++, mais pour les langages dynamiques, vous devrez générer une répartition dynamique pour littéralement toutes les opérations de base et pour tous les appels de méthode. Cette répartition dynamique est le principal goulot d'étranglement pour toutes les langues de ce type.

Dans certains cas, il est possible d'éliminer la répartition dynamique (ainsi que les appels virtuels en Java) à l'aide d'un compilateur JIT de traçage beaucoup plus compliqué. Cette approche est encore à ses balbutiements, ne faisant pas trop d'interprétation abstraite, et un tel compilateur est susceptible d'étouffer les appels eval (qui sont très typiques pour les langages dynamiques).

Quant à la différence entre Python et PHP, ce dernier est juste d'une qualité bien inférieure. Il pourrait fonctionner plus rapidement en théorie, mais il ne le sera jamais.

26
SK-logic

Il y a un problème général avec cette question en ce qu'elle est trop absolue. Cela n'a pas vraiment de sens de dire "la langue X est plus rapide que la langue Y". Un langage informatique lui-même n'est ni "rapide" ni "lent" car il s'agit simplement d'un moyen d'exprimer un algorithme. La vraie question devrait être de l'ordre de "pourquoi l'implémentation X1 du langage X est-elle plus rapide que l'implémentation Y1 du langage Y pour ce domaine de problème particulier?"

Certaines différences de vitesse vont certainement tomber de la langue elle-même car certaines langues sont plus faciles à implémenter certains domaines que d'autres. Mais une grande partie de ce qui rend une implémentation rapide n'est pas le langage. Par exemple, vous ne pouvez pas vraiment dire "Python est plus lent que Java" sans vous demander si vous parlez de CPython, IronPython ou PyPy. Cela est particulièrement vrai pour les langues qui utilisent un VM car la vitesse va être directement affectée par la qualité de la VM.

En passant, je travaille avec un système qui, pour diverses raisons, ne peut pas utiliser JIT sur notre appareil avec un JavaScript très populaire VM qui le prend normalement en charge. Cela signifie que notre JavaScript fonctionne très loin plus lent que sur un PC doté d'un processeur similaire. Cette modification, qui n'est pas directement liée au langage lui-même, fait passer JavaScript de "quelques fois plus lent que C++" à "d'ordre de grandeur plus lent que C++" pour le tâches qui nous tiennent à cœur.

Tenez également compte du fait que les langues diffèrent dans leurs caractéristiques de performance de manière qui ne sont pas directement comparables. Trop de tests de référence traduisent simplement un programme de la langue A vers la langue B et ne tiennent pas compte du fait que les langues diffèrent dans les fonctionnalités qui sont rapides. (Vous pouvez le voir dans n'importe quelle comparaison de référence raisonnable, comme celles auxquelles vous liez, car elles ont souvent des notes comme "merci à tel ou tel pour m'avoir montré comment l'implémenter dans le langage Foo.)

Par exemple, prenez ceci Java:

for(int i=0;i<10;i++) {
    Object o = new Object;
    doSomething(o);
}

Il serait tentant de "réécrire" cela en C++ et de comparer les temps d'exécution:

for(int i=0;i<10;i++) {
    Object *o = new Object;
    doSomething(o);
    delete(o);
}

Le fait est que tout programmeur C++ compétent verra immédiatement qu'en C++, ce n'est pas le moyen le plus rapide de faire quelque chose. Vous pouvez facilement accélérer les choses en le modifiant pour qu'il soit plus approprié au C++:

for(int i=0;i<10;i++) {
    Object o;
    doSomething(&o);
}

Le fait n'est pas que C++ peut être rapide mais plutôt que d'écrire des benchmarks pour comparer des langages est vraiment, vraiment difficile. Pour le faire correctement, vous devez être un expert dans les deux langues et écrire à partir de zéro dans les deux langues. Même alors, vous pouvez facilement vous heurter à des domaines où une langue excelle dans une tâche particulière. Par exemple, je peux écrire une version de Towers of Hanoi en C++ qui fonctionnera plus vite que Java sur n'importe quel compilateur raisonnable. Je peux le faire en trichant essentiellement, en utilisant des modèles C++, évalués au moment de la compilation) (http://forums.devshed.com/c-programming-42/c-towers-of-hanoi-using-templates-424148.html)

Le point n'est pas que je pourrais dire que "C++ est plus rapide que Java" parce que mon programme est revenu instantanément pendant que la version Java s'exécutait pendant quelques minutes (et en espérant que personne ne remarquait que mon programme prenait une demi-heure pour build.) Le fait est que pour ce cas étroit variable, C++ est plus rapide. Pour d'autres cas étroits, ce pourrait être l'inverse. Donc ce n'est pas "C++ est plus rapide", c'est "C++ est plus rapide dans les cas où vous peut évaluer l'expression au moment de la construction à l'aide de modèles. "Moins satisfaisant, mais vrai.

Les différences de vitesse dans les langues concernent principalement l'implémentation. Les langues compilées seront plus rapides que les langues interprétées. La compilation en code natif sera plus rapide que la compilation en code octet. Cela aura beaucoup plus d'effet que des questions comme si la langue est ou non typée statiquement. Et bien sûr, les bonnes implémentations vont être plus rapides que les mauvaises.

Et n'oubliez pas que les bons programmeurs vont produire du code plus rapidement que les mauvais programmeurs, souvent dans une mesure qui dépasse largement les différences de langue.

20
Gort the Robot

Cela a à voir avec la qualité du compilateur, le compilateur de Java a été continuellement optimisé pendant beaucoup plus longtemps, et l'optimisation est plus importante car tout le code est compilé pour Java. Je ne suis pas sûr de la raison exacte pour laquelle python pour être plus rapide que PHP, mais je parierais son en raison de l'influence de Google avec Python.

6
Ryathal

Pourquoi Java est le plus rapide:

Dactylographié de manière statique + Compilation JIT + - Indicateur de serveur pour recompiler agressivement le code en cours d'exécution.

Pourquoi Python est plus rapide que PHP:

Python est peut-être un langage dynamique, mais il est toujours fortement typé. Cela signifie que les structures que vous codez sont capables d'optimisation d'exécution.

Pourquoi PHP craint:

Il s'agit essentiellement de javascript sur le serveur (pas de support multithreading, totalement dynamique, typé de manière lâche).

En substance, plus le compilateur connaît votre code, plus il peut optimiser. Java est entièrement optimisable avant son exécution et pendant son exécution. Python est optimisable pendant son exécution, et PHP est, enfin, terrible. Facebook transpose en fait leur PHP en C avant qu'il n'atteigne le serveur.
https://developers.facebook.com/blog/post/2010/02/02/hiphop-for-php--move-fast/

4
Ajax

Les repères sont plutôt biaisés en faveur d'une programmation mathématique lourde.

Il n'est pas surprenant que Python est assez bon en mathématiques complexes si vous considérez où et pourquoi a été écrit pour la première fois .

PHP d'autre part a été écrit pour servir des pages Web, il peut faire autre chose, mais les pages Web sont ce qu'il y a de mieux et sur un pied d'égalité ou mieux que Java à cette tâche.

1
James Anderson