Una preguntilla... si todos dicen que Python es bastante más lento por ser interpretado en vez de compilado... ¿porqué nadie ha hecho un compilador de python para solucionarlo? ¿Porque no permitirá el intérprete crear un EXE directamente...? Ya sé que existen py2exe y pyinstaller, pero los veo más como "apaños" hechos por usuarios.
Hay algunas razones importantes:
1- Python es un lenguaje de tipado dinámico. Esta característica dificulta mucho la generación de código nativo y ensamblado del binario, al no haber información definida del tamaño de las estructuras que lo conforman. Esto implica generar mas código para la gestión de las estructuras de datos.
2 - El Garbage Collector. Un programa nativo necesitaría un hilo extra que contase las referencias utilizadas y mantuviera el heap limpio, o bien el compilador debería analizar las asignaciones y generar código que recubra esas sentencias haciendo el programa más lento aún; amén de engorroso y dificil de depurar.
3 - En python se puede hacer uso de reflection, lo cual implica que hay que introducir en el código nativo un sistema de información de tipos con todos sus metadatos. Esto penaliza el rendimiento y consume recursos. Como curisoidad el compilador C++ incluye un sistema parecido (RTTI) que puede habilitarse o no.
4- Una llamada a eval() implicaría mucha complejidad.
5 - Generar código nativo haría que se perdiesen muchas de las ventajas de un lenguaje interpretado (más seguridad ante errores de programación, más facil de depurar, más facilmente portable, etc) En muchas ocasiones un lenguaje interpretado es lo más adecuado.
Por lo tanto se toman vías intermedias. La más habitual es compilar a bytecode y hacer uso de una VM con un JIT
El intérprete Python es precisamente un JIT, por lo que durante el interpretado del programa se compilará a nativo partes del código propensas a ser optimizadas. Esto implica que, dependiendo de cómo sea el programa, este puede ser tan rápido como uno nativo. Dependerá de muchos factores.
La combinación bytecode + JIT ofrece un rendimiento muy bueno y toma las ventajas de ejecutar algo sobre una máquina virtual. Hacer un compilador python a código nativo, además de por las dificultades técnicas comentadas antes, no aportaría tampoco grandes ventajas.
De todos modos existen frikadas tipo Cython. Se trata de un traductor que transforma el código python a C. Ignoro cómo funciona.