¿Por qué Python es más lento que Java pero más rápido que PHP? [Cerrado]

17

Muchas veces he visto varios puntos de referencia que muestran cómo funcionan varios idiomas en una tarea determinada.

Estos puntos de referencia siempre revelan que Python es más lento que Java y más rápido que PHP, y me pregunto por qué ese es el caso.

  • Java, Python y PHP se ejecutan dentro de una máquina virtual
  • Los tres idiomas convierten sus programas en sus códigos de bytes personalizados que se ejecutan en la parte superior del sistema operativo, por lo que ninguno se ejecuta de forma nativa
  • Tanto Java como Python se pueden "compilar" ( .pycpara Python) pero el __main__módulo para Python no está compilado

Python y PHP se escriben dinámicamente, y Java estáticamente, esta es la razón por la que Java es más rápido, y si es así, explique cómo afecta eso a la velocidad.

E, incluso si el argumento dinámico vs estático es correcto, esto no explica por qué PHP es más lento que Python, porque ambos son lenguajes dinámicos.

Puedes ver algunos puntos de referencia aquí y aquí , y aquí

codificador de árboles
fuente
Con respecto a Python vs. PHP: es solo un problema de calidad de implementación, lo más probable.
Charles Salvia
8
@good_computer La mayoría de los puntos de referencia están muy mal hechos. Hubo otro reciente (no creo que haya vinculado) que la mayoría de las personas que lo revisaron se quejaron de que el lenguaje que afirmó ser "más rápido" simplemente tenía el mejor código optimizado. Por lo general, esto lo hace inconscientemente alguien que no está tan familiarizado con los idiomas que terminan siendo considerados "lentos", por lo que no se dan cuenta de que están escribiendo un código mejor en los que han encontrado que son "rápidos".
Izkata
@good_computer Me parece que está reclamando algo, ya que su pregunta incluye el texto " Siempre estos puntos de referencia revelan que Python es más lento que Java y más rápido que PHP " y " PHP es más lento que Python ". Eliminar esas citas y reformular la pregunta para que sea independiente del idioma podría reabrirla.
briddums
Esta pregunta es realmente parcial : (1) refiriéndose a puntos de referencia no autorizados realizados en código ingenuamente no optimizado escrito por programadores novatos en idiomas que no dominan (como se analiza en los hilos de comentarios respectivos) y (2) construido sobre conceptos erróneos acerca de los lenguajes interpretados / bytecode (php / python se interpretan, los archivos de caché de python bytecoded de java son árboles de sintaxis abstracta, no bytecode) y el estado de los tres idiomas (hay versiones compiladas de python y php - python son más maduros, compilados php, sin embargo, ejecuta Facebook)
ZJR

Respuestas:

26

El código JVM puede compilarse JIT de manera eficiente, utilizando un compilador ad hoc trivial (y rápido). Pero lo mismo sería excepcionalmente difícil para PHP y Python, debido a su naturaleza de tipo dinámico. JVM se traduce en un código nativo directo y de nivel bastante bajo, bastante similar a lo que produciría un compilador de C ++, pero para los lenguajes dinámicos tendría que generar un despacho dinámico para literalmente todas las operaciones básicas y para todas las llamadas a métodos. Este despacho dinámico es el principal cuello de botella para todos los idiomas de este tipo.

En algunos casos, es posible eliminar el despacho dinámico (así como las llamadas virtuales en Java) utilizando un compilador JIT de rastreo mucho más complicado. Este enfoque todavía está en pañales, no hace demasiada interpretación abstracta, y es probable que dicho compilador se atragante con las evalllamadas (que son muy típicas para los lenguajes dinámicos).

En cuanto a la diferencia entre Python y PHP, este último es de una calidad mucho menor. Podría correr más rápido en teoría, pero nunca lo hará.

SK-logic
fuente
1
¿Por qué JIT es "excepcionalmente" difícil para los lenguajes dinámicos? Mire v8 o TraceMonkey en el mundo de JavaScript: allí JIT funciona bien.
Treecoder
66
@good_computer, los JIT de rastreo son notablemente más complejos de lo normal, JIT ad hoc, y aún funcionan mucho más lentamente que los JIT para los idiomas estáticamente tipados. Un JIT de seguimiento adecuado implicaría una interpretación abstracta completa, y se ahogaría con todas y cada una de las evalllamadas.
SK-logic
2
Probablemente hay un centenar de ingenieros dentro del equipo compilador de HotSpot de Oracle que no estarían de acuerdo con la parte "trivial" :-)
Jörg W Mittag
1
@ JörgWMittag, por supuesto, HotSpot no es tan sencillo, hace un poco de análisis estático, está utilizando los resultados de perfiles de tiempo de ejecución, pero aún así es mucho más simple que un JIT de seguimiento adecuado. Y, diría, HotSpot es demasiado complicado y su implementación es, por decirlo cortésmente, un poco demasiado detallado.
SK-logic
1
@ Frank Shearar, un JIT ad hoc para un lenguaje dinámico es tan trivial como para uno estáticamente tipado (ver LuaJIT por ejemplo). OTOH, un JIT eficiente es una cosa totalmente diferente.
SK-logic
21

Hay un problema general con esta pregunta porque es demasiado absoluta. Realmente no tiene sentido decir "el lenguaje X es más rápido que el lenguaje Y". Un lenguaje de computadora en sí mismo no es "rápido" o "lento" porque es simplemente una forma de expresar un algoritmo. La pregunta real debería ser algo del orden de "¿por qué la implementación X1 del lenguaje X es más rápida que la implementación Y1 del lenguaje Y para este dominio problemático en particular?"

Ciertamente, algunas diferencias de velocidad caerán del lenguaje en sí ya que ciertos idiomas son más fáciles de implementar ciertos dominios que otros. Pero gran parte de lo que hace que una implementación sea rápida no es el lenguaje. Por ejemplo, no se puede decir "Python es más lento que Java" sin considerar si se trata de CPython, IronPython o PyPy. Esto es particularmente cierto para los lenguajes que usan una VM, ya que la velocidad se verá directamente afectada por la calidad de la VM.

Por otro lado, trabajo con un sistema que por varias razones no puede usar JIT en nuestro dispositivo con una máquina virtual JavaScript muy popular que normalmente lo admite. Esto significa que nuestro JavaScript funciona mucho, mucho más lento que en una PC con un procesador similar. Ese cambio, que no está directamente relacionado con el lenguaje en sí, lleva a JavaScript de ser "unas veces más lento que C ++" a ser "órdenes de magnitud más lentos que C ++" para las tareas que nos interesan.

También tenga en cuenta que los idiomas difieren en las características de rendimiento en formas que no son directamente comparables. Demasiados puntos de referencia simplemente traducen un programa del idioma A al idioma B y no tienen en cuenta que los idiomas difieren en qué funciones son rápidas. (Puede ver esto en cualquier comparación de referencia razonable, como las que vincula, ya que a menudo tienen notas como "gracias a tal y tal por mostrarme cómo implementarlo en lenguaje Foo").

Por ejemplo, tome este código Java:

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

Sería tentador "reescribir" esto en C ++ y comparar los tiempos de ejecución:

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

La cuestión es que cualquier programador competente de C ++ verá de inmediato que en C ++, esta no es la forma más rápida de hacer algo. Puede acelerar las cosas fácilmente cambiándolo para que sea más apropiado para C ++:

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

El punto no es que C ++ pueda ser rápido, sino que escribir puntos de referencia para comparar lenguajes es realmente difícil. Para hacerlo adecuadamente, debes ser un experto en ambos idiomas y escribir desde cero en ambos idiomas. Incluso entonces, puede encontrar fácilmente áreas donde un idioma sobresale en una tarea en particular. Por ejemplo, puedo escribir una versión de Towers of Hanoi en C ++ que se ejecutará más rápido que Java en cualquier compilador razonable. Puedo hacer eso esencialmente haciendo trampa, usando plantillas de C ++, evaluadas en tiempo de compilación (http://forums.devshed.com/c-programming-42/c-towers-of-hanoi-using-templates-424148.html)

El punto no es que podría decir que "C ++ es más rápido que Java" porque mi programa regresó instantáneamente mientras la versión de Java se ejecutó durante minutos (y esperando que nadie se diera cuenta de que mi programa tardó media hora en construirse). El punto es que para esto varía caso estrecho, C ++ es más rápido. Para otros casos estrechos, podría ser al revés. Por lo tanto, no es "C ++ es más rápido", es "C ++ es más rápido en los casos en que puede evaluar la expresión en el momento de la compilación utilizando plantillas". Menos satisfactorio, pero cierto.

Las diferencias de velocidad en los idiomas se refieren principalmente a la implementación. Los idiomas compilados serán más rápidos que los idiomas interpretados. Compilar en código nativo será más rápido que compilar en código de bytes. Esto tendrá mucho más efecto que preguntas como si el idioma está estáticamente escrito o no. Y, por supuesto, las implementaciones buenas serán más rápidas que las malas.

Y no olvide que los buenos programadores producirán un código más rápido que los malos programadores, a menudo en una medida que supera con creces las diferencias de idioma.

Gort the Robot
fuente
6

Tiene que ver con la calidad del compilador, el compilador de Java se ha optimizado continuamente durante mucho más tiempo, y la optimización es más importante porque todo el código está compilado para Java. No estoy seguro de la razón exacta para que Python sea más rápido que PHP, pero apuesto a que es debido a la influencia de Google con Python.

Ryathal
fuente
8
¿Por qué se rechazó esto? Esta es exactamente la respuesta: el rendimiento es puramente una cuestión de investigación y esfuerzo de ingeniería, y por lo tanto, en última instancia, dinero. Las empresas que producen implementaciones de Java son más ricas que las que producen implementaciones de Python o PHP. Eso es todo.
Jörg W Mittag
1
Además, estoy bastante seguro de que las optimizaciones de CPython no se aceptan si hacen que el código sea demasiado difícil de leer y solo mejoren el rendimiento por muy poco.
Cgt
2
+ Jörg W Mittag: Estoy en desacuerdo. Algunas características del lenguaje pueden ser muy difíciles de implementar de manera performativa, por lo tanto, hacen que la creación de una implementación eficiente sea muy difícil o casi imposible. Por otro lado, es trivialmente fácil crear una implementación "eficiente" del lenguaje "ensamblador".
user281377
@ammoQ Sospecho que gran parte de eso se reduce a los sistemas de tipos y, en particular, a la capacidad de saber exactamente qué tipo tiene y cuáles son las semánticas exactas de las operaciones permitidas. Los lenguajes dinámicos ganan flexibilidad por su naturaleza, pero hacen que sea más difícil hacer las pruebas de tipo (y así compilar en un código hiperrápido seguro).
Donal Fellows
1
@DonalFellows Exactamente mi pensamiento. Cuanto menos se sepa en tiempo de compilación, más se tiene que resolver durante el tiempo de ejecución.
user281377
4

Por qué Java es el más rápido:

Tipo estático + compilación JIT + - bandera del servidor para recompilar agresivamente el código en ejecución.

Por qué Python es más rápido que PHP:

Python puede ser un lenguaje dinámico, pero todavía está fuertemente tipado. Esto significa que las estructuras que codifica son capaces de optimizar el tiempo de ejecución.

Por qué PHP apesta:

Básicamente es javascript en el servidor (no es compatible con subprocesos múltiples, totalmente dinámico, tipeado libremente)

En esencia, cuanto más sepa el compilador sobre su código, más podrá optimizar. Java es completamente optimizable antes de ejecutarse y mientras se ejecuta. Python es optimizable mientras se está ejecutando, y PHP es, bueno, terrible. Facebook realmente transpila su PHP a C antes de que llegue al servidor.
https://developers.facebook.com/blog/post/2010/02/02/hiphop-for-php--move-fast/

Ajax
fuente
En realidad, javascript en el servidor es Node.JS y, por lo que entiendo (aunque no voy a demostrar esto), el motor V8 supera a PHP en general (aunque probablemente no por una tonelada). Además, debe mencionar que Python se puede compilar a nativo (¿Cómo funciona en comparación con Java entonces?)
Jimmy Hoffa
No he usado Python lo suficiente como para ayudarlo allí, pero puedo decir que nodejs que ejecuta V8 tiene soporte para extensiones C nativas (aunque cruzar el límite JS / C es supuestamente lento), además puede aprovechar el compilador JIT de Google. .. No me sorprendería si el nodo es más rápido que python y php. Aquí hay un punto de referencia (defectuoso como la mayoría) blog.famzah.net/2010/07/01/… Tenga en cuenta que Java parecía más lento que JS hasta que un comentarista señaló nuestros defectos en el punto de referencia ... Entonces, tómelo con un grano de sal. :)
Ajax
Dicho esto, el nodo y el php también son de una sola hebra, y a menos que te guste configurar proxies de clúster (como haproxy), no tocaría ninguno de ellos en un entorno de producción serio.
Ajax
1

Los puntos de referencia están bastante sesgados a favor de la programación matemática pesada.

No es sorprendente que Python sea bastante bueno en matemáticas complejas si considera dónde y por qué se escribió por primera vez .

PHP, por otro lado, fue escrito para servir páginas web, puede hacer otras cosas, pero las páginas web es lo mejor y está a la par o mejor que Java en esta tarea.

James Anderson
fuente