para - ¿Python es más lento que Java/C#?
python o java (13)
¿Python es más lento que Java / C #?
performance-comparison-c-java-python-ruby-jython-jruby-groovy
Aquí hay un proyecto que optimiza CPython: unladen-swallow
Como se interpreta y no se compila, debe ser más lento en tiempo de ejecución.
Como una tabla mencionada en el libro Code Complete (segunda edición) , página 600,
C # es igual a C ++ en tiempo de ejecución (1: 1). Y Python es más lento por encima de cien veces que C ++ en tiempo de ejecución (> 100: 1).
Y Java es más lento que C ++ por una vez y media (1.5: 1).
Estas estadísticas son en promedio. No sé quién hizo este estudio, pero parece interesante.
Como se menciona en las otras respuestas, esto depende tanto del sistema de tiempo de ejecución como de la tarea en cuestión. Entonces, el Python estándar (C) no es necesariamente más lento que Java o C #. Algunos de sus módulos se implementan en C. De esta forma se combina la velocidad de una implementación nativa con el lenguaje de Python.
Hicimos un pequeño experimento: comparamos el tiempo de ejecución de un cálculo factorial en diferentes idiomas. La prueba fue pensada para evaluar el rendimiento de las implementaciones de enteros de precisión arbitraria.
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
El gráfico de barras muestra los resultados. Python es el claro ganador. Por lo que sé, Python usa el Karatsuba-algorithm para multiplicar números enteros grandes, lo que explica la velocidad.
Además, el tipo de "enteros de precisión arbitraria" de Python es el long
incorporado. Por lo tanto, ni siquiera necesita el manejo de tipos especiales que se requiere para la clase BigInteger de Java.
Como se sugiere en los comentarios, realmente debería proporcionar un caso de prueba para razonar. Las razones detrás de las diferencias de rendimiento cambiarán dependiendo de la prueba que se esté ejecutando.
Sin embargo, sugeriría que la naturaleza estática vs dinámica puede tener mucho que ver con eso. Para llamadas no virtuales, el C # / Java compilado con JIT es extremadamente económico, ya que se puede determinar con precisión en el tiempo JIT. Incluso las llamadas virtuales solo implican un solo nivel de redirección. Cuando el enlace se vuelve dinámico, hay una gama más amplia de cosas a considerar.
No conozco suficientes detalles sobre Python como para afirmar comprender su comportamiento de tiempo de ejecución exacto, que sospecho que también puede variar con la versión y la implementación. Existe un "código de byte de Python" que luego es ejecutado por una máquina virtual, ya sea que esta máquina virtual realmente realice o no la compilación de JIT es otra cuestión.
Creo opuesto. Puedo hacer un programa simple en Python más rápido que en Java, y esos scripts Python funcionan muy rápido.
Por supuesto, su pregunta sin ejemplos es difícil de responder. Tal vez hayas encontrado una biblioteca lenta, errores, etc. Danos más detalles, por favor.
Creo que finalmente Python no llega tan lejos como puede con optimizaciones. La mayoría de las técnicas de optimización que son comunes son para lenguajes estáticos. Existen técnicas de optimización para lenguajes dinámicos, pero las modernas no parecen hacer tanto uso de ellas como podrían. Steve Yegge tiene una excelente publicación en el blog sobre el tema .
EDITAR : Solo quería señalar que no estoy afirmando necesariamente que esto sea crítico con Python. Prefiero simplicidad sobre velocidad innecesaria cualquier día.
Este tipo de pregunta no puede ser respondida solo por razonamiento cualitativo, necesita buenos puntos de referencia para respaldarlo. Aquí hay un conjunto que compara Python 3 vs C # Mono y encuentra que Python es de 3 a 300 veces más lento. Los resultados de Python vs. Java son similares. (Se aplican las precauciones habituales sobre la interpretación de los puntos de referencia).
Estos puntos de referencia también informan sobre el tamaño del código fuente, y Python fue significativamente más conciso que Java y C #.
Lo que obtuve allí es un claro ejemplo de cómo escribir 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 poco más pitónico:
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
No combine el idioma y el tiempo de ejecución.
Python (el lenguaje) tiene muchas implementaciones en tiempo de ejecución.
CPython generalmente se interpreta y será más lento que el código nativo C #. Puede ser más lento que Java, según el compilador Java JIT.
JYthon se interpreta en la JVM y tiene el mismo perfil de rendimiento que Java.
IronPython depende de las mismas bibliotecas .NET e IL como C #, por lo que la diferencia de rendimiento será relativamente pequeña.
Python se puede traducir al código nativo a través de PyREX, PyToC y otros. En este caso, generalmente funcionará tan bien como C ++. En cierta medida, puede optimizar aún más C ++ y tal vez exprimir un rendimiento un poco mejor que la salida no optimizada de PyREX.
Para obtener más información, consulte http://arcriley.blogspot.com/2009/03/so-long-pyrex.html
Tenga en cuenta que Python (el idioma) no es lento. Algunos tiempos de ejecución de Python (CPython, por ejemplo) serán más lentos que el código nativo C ++.
No es realmente correcto preguntar por qué Python es más lento que Java / C #. ¿Qué tan rápido es Java? Bueno, los intérpretes ingenuos son alrededor de diez veces más lentos que los compiladores optimizados. Creo que hay un intérprete de código byt Java escrito en JavaScript, que probablemente no sea muy rápido. Entonces, la pregunta prevista parece ser "¿Por qué el sistema de lenguaje CPython es más lento que el Sun, IBM y Oracle JRE y el tiempo de ejecución de Microsoft .NET equivalentes?"
Creo que la respuesta correcta no es técnica. Los tiempos de ejecución más rápidos de Java y .NET son más rápidos porque tienen grandes equipos técnicos de tiempo completo que los desarrollan en un entorno competitivo.
Los sistemas de lenguaje dinámico son fáciles de implementar. Cualquier idiota puede hacerlo. Yo tengo. Los sistemas de lenguaje estático son más complejos de diseñar e implementar. Un sistema estático simple tenderá a funcionar mucho más rápido que el equivalente dinámico equivalente que simplemente funciona. Sin embargo, es posible que los sistemas dinámicos altamente optimizados funcionen casi tan rápido. Entiendo que algunas implementaciones de Smalltalk fueron bastante buenas. Un ejemplo citado a menudo de un sistema dinámico desarrollado es la máquina MIT Lisp .
Además, si el ronco real está siendo hecho por código de biblioteca, entonces el sistema de lenguaje puede no importar. Alternativamente, el lenguaje puede alentar (o dar tiempo (!)) A desarrollar algoritmos más eficientes que puedan eliminar fácilmente las diferencias constantes en el rendimiento del factor.
No tiene nada que ver con los idiomas en sí, es solo el hecho de que la implementación de Java y el sistema de tiempo de ejecución (JVM) son de muy alta calidad, y que muchos recursos se han invertido en estabilidad, escalabilidad y mejoras de rendimiento a lo largo de los años.
Contraste eso con el hecho de que la implementación de CPython recientemente implementó, por ejemplo, el envío de subprocesos en su intérprete, que le dio un aumento del rendimiento de hasta un 20% para ciertos problemas. No es algo bueno ya que suena, es malo porque ese tipo de optimización básica debería estar ahí desde el primer día.
Simplemente - Python es lento .
No importa qué intérprete (actualmente disponible) utilice, es más lento que Java y C. En varios puntos de referencia, es más lento que Ruby y PHP. No dependas de las respuestas de los demás, revisa y verifica tú mismo.
Personalmente, no creo que haya mucha contribución y desarrollo serios para lograr Python más rápido. Dado que la productividad es buena en Python y resuelve algunos problemas directamente, la velocidad / rendimiento no se toma en serio. También hay algunos problemas de arquitectura que impiden que Python obtenga ajustes de rendimiento.
Descargo de responsabilidad : esta respuesta probablemente perjudicará a los amantes de Python. Yo también soy un desarrollador de Python, me encanta desarrollar aplicaciones web en Django / Flask / Pyramid en lugar de Spring (Java). Pero veo prácticamente en mi trabajo y experiencia que Python es más lento. La velocidad no siempre es mi prioridad. Pero sí apoyo con ellos, quien dice que el intérprete de Python debería engrasar y engrasar o cambiar el motor por lo menos para estar en el maratón. Es un lenguaje de programación dominante.
Todo se reduce al hecho de que la fase de compilación tiene menos información para trabajar y, por lo tanto, el tiempo de ejecución necesita más trabajo en el caso de los lenguajes de tipo pato (tipado dinámicamente).
Por lo tanto, si hago la invocación del método foo.bar (), en el caso de Java o C ++ la invocación a la barra se puede optimizar en el proceso de compilación descubriendo el tipo de "foo" y luego invocando directamente el método en la ubicación de memoria donde el compilador sabe que se encontrará. Dado que un python o cualquier otro compilador de lenguaje de tipo dinámico no sabe a qué tipo pertenece el objeto foo, tiene que hacer una verificación de tipo en el tiempo de ejecución y luego buscar la dirección del método de barra y luego invocarlo.
Hay otras dificultades con las que también se enfrenta un escritor compilador de Python, aunque la que está arriba con suerte da una indicación adecuada. Por lo tanto, incluso con los mejores escritores de compiladores, es probable que los lenguajes de tipo estático funcionen mucho mejor en tiempo de ejecución.
Donde el puntaje de los lenguajes tipados dinámicamente está típicamente en el tiempo de desarrollo. Debido a que hay menos líneas de código para escribir y mantener, y no hay tiempos de espera de compilación para los desarrolladores, el desarrollo suele ser mucho más rápido.
Yo diría que la facilidad y simplicidad de escribir código Python hace posible escribir código más complejo; por ejemplo, código que aprovecha los procesadores multi-core. Como el rendimiento por núcleo se ha mantenido estancado durante los últimos 5-10 años, no creo que esté claro que los programas de Python (ya sea que se ejecuten en CPython o algo más) sean más lentos a largo plazo.