¿Por qué no se ha optimizado Python como las implementaciones modernas de Javascript?

11

Las implementaciones modernas de Javascript como V8 (Chrome), SpiderMonkey (Firefox) y Chakra (IE / Edge) tienen compilación JIT y varias otras optimizaciones para mejorar el rendimiento.

¿Por qué Python no tiene estos?

He estado mirando PyPy y IronPython, que reclaman ganancias de velocidad. PyPy No entiendo cómo una implementación de Python escrita en Python, un lenguaje interpretado, será más rápida que la implementación de referencia en C. IronPython, la misma idea, pero no veo cómo .NET Framework aumentará la velocidad.

Arrendajo
fuente
2
IronPython, como cualquier otro lenguaje .NET, se compila en el "lenguaje intermedio común" de Microsoft para el que existen implementaciones de compilador JIT muy maduras.
Doc Brown
2
Un lenguaje de programación es una especificación (escrita en algún documento), no un software. Solo las implementaciones de lenguaje de programación son software (y pueden ser compiladores o intérpretes).
Basile Starynkevitch
1
@BasileStarynkevitch: No entiendo lo que intentas decirnos con este comentario. El OP pregunta explícitamente sobre CPython, PyPy y IronPython, que son implementaciones específicas de Python.
Doc Brown
1
@DocBrown Parece un punto relevante para mencionar, dado el último párrafo de la pregunta, que muestra un malentendido cuando específicamente llama a Python un lenguaje interpretado.
8bittree

Respuestas:

19

¿Por qué Python no tiene estos?

No estoy seguro de por qué crees que no hay implementaciones de Python que se preocupen por el rendimiento. PyPy , IronPython y Jython son implementaciones de Python de potencia industrial listas para producción que se preocupan por el rendimiento. Pyston es una implementación en desarrollo que se creó específicamente para el rendimiento. Unladen Swallow y Psyco también fueron proyectos para mejorar el rendimiento de Python.

Sin embargo, el hecho de que los usuarios de CPython superen en gran medida la base total de usuarios combinados de todas las otras implementaciones, que Unladen Swallow fue rechazado por la comunidad, que la mayoría de estos proyectos están muertos o tienen dificultades para atraer desarrolladores, debería decirle algo sobre cómo Python La comunidad valora el desempeño.

Esta respuesta es un buen ejemplo de la mentalidad típica de la comunidad Python: en lugar de solucionar los problemas de rendimiento, simplemente preferirían escribir su código no en Python.

He estado mirando PyPy y IronPython, que reclaman ganancias de velocidad. PyPy No entiendo cómo una implementación de Python escrita en Python, un lenguaje interpretado, será más rápida que la implementación de referencia en C.

En primer lugar: no importa en qué idioma esté escrito el compilador. Después de todo, el compilador solo se ejecuta una vez , por lo que incluso si fuera lento, eso no importa: el rendimiento del compilador es irrelevante, lo que es relevante es el rendimiento de la salida del compilador.

En segundo lugar, ya que sólo importa la rapidez con la salida del compilador es, y el compilador está escrito en Python, es decir, el lenguaje que compila, en realidad puede hacer que en sí rápido mediante la compilación de sí mismo.

En tercer lugar, no existe un "lenguaje interpretado". Un lenguaje es un conjunto de reglas y restricciones matemáticas. Es una especificación. Un pedazo de papel. Un idioma no se compila ni se interpreta. Un idioma simplemente es . La compilación y la interpretación son rasgos de una implementación de lenguaje , más precisamente, un compilador o intérprete (¡duh!), No el lenguaje. Cada lenguaje puede ser implementado por un compilador. Cada idioma puede ser implementado por un intérprete. Puede generar mecánicamente un compilador a partir de un intérprete y un intérprete a partir de un compilador.

Pero todo esto realmente no importa, porque PyPy en realidad no está escrito en Python. Está escrito en RPython . RPython consta de dos partes, el lenguaje de programación RPython y el marco RPython.

El lenguaje de programación RPython no es Python. Es un lenguaje de programación diferente. RPython es un lenguaje de programación de tipo estático, aproximadamente en el mismo nivel de abstracción que Java, con aproximadamente el mismo rendimiento que C. RPython es un subconjunto sintáctico y semántico de Python, lo que significa que cada programa RPython es un programa Python válido y puede ser ejecutado por una implementación de Python (aunque generalmente varios órdenes de magnitud más lento, pero esto sigue siendo útil para la depuración porque obtienes acceso a todas las herramientas de Python, y la interpretación comienza de inmediato, mientras que compilar la implementación del lenguaje generalmente demora entre 5 y 10 minutos ), Pero la conversación no es verdadera.

El marco RPython es un marco para escribir implementaciones de lenguaje dinámico de alto rendimiento en el lenguaje de programación RPython. Incluye un recolector de basura, espacio de objetos, protocolo de metaobjetos, objetos, tipos y operaciones predefinidos, etc. Pero la joya de la corona es su capacidad de generar automáticamente un compilador JIT a partir de un intérprete: si implementa un lenguaje en el marco de RPython, solo tiene que escribir un intérprete, el marco de RPython se encarga del JIT.

Hay muchas implementaciones de lenguaje en la plataforma RPython , no solo PyPy.

IronPython, la misma idea pero no veo cómo .NET Framework aumentará la velocidad.

La mayoría de las implementaciones de la CLI ISO, como las diversas variantes .NET de Microsoft o Mono, contienen sofisticados recolectores de basura, optimizadores y compiladores. Lo mismo es cierto para las implementaciones de Jython y Java.

IronPython es un compilador, compila el código fuente de Python en árboles DLR (DLR es Dynamic Language Runtime), que luego se compila en código de bytes CIL, que luego se vuelve a compilar en código máquina nativo.

Jörg W Mittag
fuente
6

Las implementaciones modernas de Javascript como V8 (Chrome), SpiderMonkey (Firefox) y Chakra (IE / Edge) tienen compilación JIT y varias otras optimizaciones para mejorar el rendimiento.

¿Por qué Python no tiene estos?

JavaScript está incluido en los navegadores web y una cantidad significativa de software hoy en día está diseñado para ejecutarse en navegadores web. Esto hace que el rendimiento de JavaScript sea muy importante, lo que hace que empresas como Google, Apple y Microsoft inviertan muchos recursos para hacer que los tiempos de ejecución de JavaScript sean rápidos. Si este flujo de dinero hubiera sido redirigido a Python, sería igualmente rápido.

PyPy No entiendo cómo una implementación de Python escrita en Python, un lenguaje interpretado, será más rápida que la implementación de referencia en C.

La idea es que una vez que el código se edita en JIT, ya no se "interpreta". PyPI funciona transformando el código de Python en código de máquina (por ejemplo, código de máquina x86_64) que luego se ejecuta directamente en el procesador.

el.pescado
fuente
3
Especialmente relevante es que, en el navegador web, no hay alternativa a JavaScript (o al menos, nada disponible generalmente en todos los principales navegadores). Si desea un rendimiento rápido en el navegador web, debe tener una implementación rápida de JavaScript. Mientras que en las plataformas que ejecutan Python, es casi seguro que puede pasar a otro idioma que tenga una mejor implementación.
8bittree
-3

Si estructura su código de Python en módulos con un inicio de nivel superior simple como el archivo principal de Python (con muy poco código), entonces Python compila todo el resto de su código en código de bytes independiente de la máquina, estos son los archivos .pyc que ves en la estructura de tu directorio. Esto minimiza los tiempos de carga e interpretación después de la primera ejecución.

Si inicia su secuencia de comandos con los indicadores -O o -OO o establece PYTHONOPTIMIZE en un valor mayor que 0, se generan archivos .pyo que se optimizan aún más.

Si necesita una alta optimización para algunas funciones específicas, puede escribirlas en C, C ++, FORTRAN o GO y luego usarlas desde Python.

Steve Barnes
fuente
¿Cómo se integran extensiones que no son C en Python? Solo conozco las extensiones C para Cython.
1
@Bey: Básicamente, cualquier cosa en una biblioteca compartida, (.dll o .so), se puede llamar desde python siempre que conozca las firmas de funciones; estas se pueden configurar manualmente, generadas por herramientas como swing o incluso generadas a partir de la documentación de doxygen. stackoverflow.com/questions/5811949/… es útil al igual que blog.heroku.com/see_python_see_python_go_go_python_go
Steve Barnes