Búsqueda de sitios web

¿Por qué el código C se ejecuta más rápido que el de Python?


En este artículo, aprenderemos por qué el código del lenguaje C se ejecuta más rápido que Python.

Guido Van Rossum desarrolló Python, uno de los lenguajes de programación más conocidos. Python es popular entre los desarrolladores debido a su sintaxis clara y su código simple, incluso para los recién llegados. Aprender Python puede resultar muy ventajoso para quienes recién comienzan su carrera en programación. Pueden utilizar la capacitación en programación de Python, blogs, videos, módulos y miles de otros recursos para profundizar en todos los aspectos de este popular lenguaje. Una vez completado, podrá realizar actividades de desarrollo modernas, como desarrollo de GUI, diseño web, administración de sistemas, transacciones o cálculos financieros complejos, ciencia de datos, visualización y la lista continúa.

Python es más lento que C ya que es un lenguaje interpretado.

Python es más lento que C ya que es un lenguaje interpretado.

Como resultado, se necesitan más instrucciones reales de la CPU para ejecutar una declaración determinada.

Puede verificar el valor de una variable en el código Python agregándole el número 1 o comparándolo con un valor dado para ver si es menor, mayor o exactamente igual a ese valor.

La diferencia es que, en lugar de que la CPU lo realice inmediatamente, el código Python será interpretado.

En términos de rendimiento, esto marca la diferencia del mundo.

Casi siempre se utiliza una máquina virtual para ejecutar código Python

Otro nombre para una computadora virtual es "intérprete de código de bytes".

El código interpretado siempre es más lento que el código de máquina real, ya que requiere muchas más instrucciones para implementar una instrucción que para ejecutar una instrucción de máquina real.

Ejemplo

Considere la expresión x += 1. En una CPU Intel, un incremento de registro es una operación única con una latencia de 1 y un rendimiento recíproco de un tercio (1/3).

En otros términos, se refiere a la instrucción de CPU más rápida que puede proporcionar un procesador Intel.

En Python, ¿cómo se logra esto x += 1?

Para entender esto, primero debes entender cómo funciona Python internamente.

Los componentes internos de Python incluyen un tokenizador, un analizador léxico, un generador de código de bytes y un intérprete de código de bytes:

  • Tokenizer: crea un flujo de tokens a partir de los archivos de texto ASCII (código Python) que se proporcionan.

  • Analizador léxico: esta área de Python se ocupa de la sangría y el espaciado adecuados. La verificación de sintaxis ocurre en este punto.

  • Generador de código de bytes: si se realiza alguna optimización, la realiza el componente Python; sin embargo, debido a que Python no es un lenguaje compilado, el rango de optimizaciones disponibles está limitado en contraste con lo que podría obtener de un compilador de C.

  • El módulo de Python conocido como "intérprete de código de bytes" administra el flujo de código de bytes y alimenta la máquina virtual de Python (mantiene su estado).

Una vez generado, el código de bytes suele almacenarse en caché en la memoria.

Debido a que no es necesario repetir los procesos de tokenización, análisis léxico y generación de código de bytes para el código que Python ya ha visto, esto mejora la velocidad.

Entonces, en lugar de pasar por los procesos de tokenización, análisis léxico y creación de códigos de bytes cada vez que realizamos un bucle while, podemos seguir pasando el código de bytes al intérprete de códigos de bytes.

¿No es esto más rápido? No, en realidad no lo es.

Aunque el uso de código de bytes almacenado en caché es más rápido, no se ejecuta ni opera tan rápidamente como el código de máquina.

La CPU real que ejecuta el código no es una computadora virtual.

Proceso de compilación

UCSD Pascal compilado, a diferencia de otros lenguajes compilados en ese momento, no fue compilado en lenguaje ensamblador. En cambio, se compiló en p-Code.

Entonces, cuando piensas en un "programa Pascal compilado", te viene a la mente p-Code. Utilice "código de bytes" si le gusta Java o Python y quiere fingir que se le ocurrió algo nuevo.

Además, Python incluye el concepto de "Python compilado", que se refiere al código Python que ha sido procesado por el tokenizador, el analizador léxico y el generador de código de bytes para crear un código de bytes almacenado en caché que está listo para ser entregado al intérprete de código de bytes (también conocido como Python). Máquina virtual).

Es un archivo de texto ASCII que contiene el código fuente de Python cuando ve un archivo con la extensión.py.

PYthon, Compilado es lo que significa un archivo con la extensión ".pyc".

Aún así, una computadora virtual ejecuta el código creado.

Código nativo

Una vez que se ha creado un programa, no se ha convertido completamente a código nativo hasta que se haya convertido a las instrucciones binarias nativas de la CPU para la plataforma para la que está diseñado.

En lugar de utilizar código de bytes, esto frecuentemente implica escribir código ensamblador, pasarlo a un ensamblador y hacer que el ensamblador cree archivos de objetos específicos de la plataforma.

Hasta que el programa esté conectado a una plataforma en tiempo de ejecución, aún no estará listo para usarse. Un tiempo de ejecución puede ofrecer servicios de tiempo de ejecución como carga dinámica de objetos y crear el entorno en el que se ejecutará el código. En C compilado, existe un tiempo de ejecución. El C++ que ha sido compilado tiene un tiempo de ejecución.

¿Por qué Python es más lento que C?

  • Python realiza numerosas comprobaciones de cordura: los números enteros nunca pueden desbordarse, nunca se puede acceder a la memoria no válida, los tipos nunca pueden ser (silenciosamente) incorrectos y las matrices nunca se pueden escribir ni leer más allá de sus extremos. En Python, es muy difícil tener un "error no local", sin embargo, en C, es bastante común tener un error que en realidad no es donde se informa el error.

  • El compilador de Python no realiza optimizaciones muy avanzadas (si las hay); por un lado, la velocidad no es tan importante como en C, y no hay tanta información para continuar; por ejemplo, en Common Lisp, otro En un lenguaje dinámico como Python, puede proporcionar anotaciones de tipo para obtener la misma velocidad que C; si opta por no participar en las comprobaciones de seguridad y promete que ciertas variables tendrán ciertos tipos, obtendrá exactamente las mismas instrucciones en código de máquina (y exactamente las mismas instrucciones extrañas). comportamiento si tiene un error en su programa).

Conclusión

En este artículo, hemos aprendido diferentes razones por las cuales la ejecución del código en lenguaje C es más rápida que Python.

Artículos relacionados: