Según tengo entendido, la causa de la diferencia de velocidad entre los lenguajes compilados y Python es que el primer código compila todo el código de la máquina nativa, mientras que Python compila al código de bytes python, para ser interpretado por el PVM. Veo que de esta manera los códigos de Python se pueden usar en múltiples sistemas operativos (al menos en la mayoría de los casos), sin embargo, no entiendo, ¿por qué no hay un compilador adicional (y opcional) para Python, que se compila de la misma manera que los compiladores tradicionales? . Esto dejaría al programador elegir, lo cual es más importante para ellos; Ejecución o rendimiento multiplataforma en máquina nativa. En general; ¿Por qué no hay idiomas que puedan comportarse como compilados e interpretados?
fuente
Respuestas:
No. La razón por la cual existen diferencias de velocidad entre lenguajes como Python y C ++ es porque los lenguajes de tipo estático le brindan al compilador toneladas de información sobre la estructura del programa y sus datos, lo que le permite optimizar tanto los cálculos como el acceso a la memoria. Debido a que C ++ sabe que la variable es de tipo int, puede determinar la forma óptima de manipular esa variable incluso antes de ejecutar el programa. En Python, por otro lado, el tiempo de ejecución no sabe qué valor hay en una variable justo hasta que el intérprete alcanza la línea. Esto es extremadamente importante para las estructuras, donde en C ++, el compilador puede determinar fácilmente el tamaño de la estructura y cada ubicación de sus campos dentro de la memoria durante la compilación. Esto le da un gran poder para predecir cómo se podrían usar los datos y le permite optimizar de acuerdo con esas predicciones.
Para compilar efectivamente lenguajes como Python, necesitarías:
fuente
eval
y un montón de otras cosas para entristecer a los escritores de compiladores. No está al nivel de gcc, pero ciertamente es más rápido que el intérprete de CPython.Dos conceptos podrían ayudarnos a comprender mejor por qué Python compilado en código máquina nativo "puede" no ejecutarse tan rápido como C compilado u otros lenguajes compilados comúnmente. Se llaman unión temprana y unión tardía.
Debería comenzar diciendo que no soy un experto en Python, y vine a este sitio por accidente. Pero me gusta este sitio.
Como se mencionó en otra respuesta aquí, el compilador de C ++ puede saber mucho sobre el programa y tomar decisiones sobre qué operaciones usar para estructuras de datos específicas. Como ejemplo, si se deben agregar dos variables enteras, el compilador sabe que son enteros nativos, de 32 bits de ancho, por ejemplo, y puede agregarlos junto con una instrucción "ADD". Por lo tanto, compila la instrucción ADD en el código. Está bloqueado y no se puede cambiar mientras el programa se está ejecutando. Eso es vinculante temprano.
Por otro lado, en un lenguaje como Python, podríamos esperar que el programa arroje diferentes tipos de datos juntos de formas complejas. Ahora el compilador no sabe si nuestras 2 variables son enteros, flotantes, cadenas o listas. Por lo tanto, tiene que compilar el código que determina esa información en tiempo de ejecución y seleccionar la operación correcta mientras se ejecuta el programa. Esto es vinculante tarde y podemos entender que habrá un impacto en el rendimiento por hacer ese trabajo adicional mientras se ejecuta el programa. Es el precio que paga por mantener abiertas esas opciones en un lenguaje como Python, pero proporciona la máxima flexibilidad de tiempo de ejecución.
fuente
Creo que tiene más que ver con los detalles de Python en sí, la misma razón por la que no puedes compilar C # en el código de la máquina. Los detalles del lenguaje en realidad podrían hacer que sus programas tengan errores, incluso si fuera posible debido a la naturaleza del lenguaje. ¿Por qué no solo aprender el lenguaje C? Es mucho más fácil que C ++ y ligeramente avanzado que Python, pero aún accesible.
fuente