Como funciona un programa python
Estimated learning time: 30 minutes
Cómo Python ejecuta tus programas
Sabias que cuando escribes código Python y le dices "¡corre!", ¿qué pasa exactamente dentro de tu computadora? En este artículo vas a entender el viaje completo que hace tu código: desde el momento en que lo escribes hasta que la máquina lo ejecuta. No necesitas experiencia previa — usaremos analogías simples para cada concepto.
El intérprete de Python
Todo comienza con el intérprete de Python. Pero, ¿qué es exactamente?
Imagina que tienes un texto escrito en español y necesitas que alguien que solo habla chino lo entienda. Necesitas un intérprete — una persona que lee tu español y lo traduce al chino en tiempo real.
Python funciona igual. Tu código está escrito en un lenguaje que los humanos podemos leer, pero tu computadora solo entiende ceros y unos (código máquina). El intérprete de Python es el programa que lee tu código y lo traduce para que la máquina lo pueda ejecutar.
💡 El intérprete de Python se llama CPython (la implementación oficial, escrita en C). Cuando instalas Python desde python.org, estás instalando CPython.
Cómo se ejecuta un programa
La vista del programador
Desde tu perspectiva como programador, el proceso parece muy simple:
- Escribes tu código en un archivo
.py - Le dices a Python que lo ejecute
- Ves el resultado
# Escribes tu código en hola.py
# Luego lo ejecutas así:
python3 hola.py
# Y ves el resultado:
# ¡Hola, mundo!
Parece magia, ¿verdad? Pero por dentro hay mucho más ocurriendo.
La vista de Python
Por dentro, Python hace dos grandes pasos antes de que veas cualquier resultado:
Paso 1: El byte code
¿Qué es el byte code?
El byte code es una versión "a medias" de tu código. No es código humano (como tu .py) ni código máquina puro (ceros y unos). Es un lenguaje intermedio que Python entiende muy bien y puede ejecutar rápidamente.
Piénsalo así: si tu código .py es como una receta en español, el byte code es esa misma receta traducida a una versión simplificada y numerada, lista para seguir paso a paso sin ambigüedad.
# Tu código en hola.py
x = 5 + 3
print(x)
# El byte code equivalente (simplificado, no lo verás así)
LOAD_CONST 5
LOAD_CONST 3
BINARY_ADD
STORE_NAME x
LOAD_GLOBAL print
LOAD_NAME x
CALL_FUNCTION 1
¿Dónde guarda Python el byte code?
Python guarda automáticamente los archivos .pyc en una carpeta llamada __pycache__ dentro de tu proyecto:
mi-proyecto/
├── hola.py
└── __pycache__/
└── hola.cpython-312.pyc ← byte code generado automáticamente
💡 Esto es una optimización: la próxima vez que ejecutes el mismo archivo, Python reutiliza el
.pycen lugar de recompilar desde cero. Si modificas tu.py, Python detecta el cambio y regenera el.pycautomáticamente.
🔴 Al igual que
venv/, la carpeta__pycache__/no debe subirse a GitHub. Agrégala a tu.gitignore.
Paso 2: La Máquina Virtual de Python (PVM)
¿Qué es la PVM?
La Python Virtual Machine (PVM) es el corazón del intérprete. Es un gran ciclo que lee cada instrucción del byte code y la ejecuta una por una.
No es una máquina física — es un programa dentro del intérprete que simula una computadora diseñada específicamente para entender byte code de Python.
💡 La PVM es la razón por la que Python puede correr en cualquier sistema operativo. El byte code es siempre el mismo, y cada plataforma tiene su propia PVM que lo interpreta en la arquitectura local.
Variaciones del modelo de ejecución
El modelo que vimos (.py → byte code → PVM) es el estándar, pero no el único. Python tiene varias formas alternativas de ejecutarse según tus necesidades.
Implementaciones alternativas de Python
CPython — La implementación oficial
Es la que instalas desde python.org. Está escrita en el lenguaje de programación C y es el estándar de referencia. Cuando alguien dice "Python", casi siempre se refiere a CPython.
# Verificar que tienes CPython
python3 --version
# Python 3.12.3 ← esto es CPython
Jython — Python en la JVM de Java
Jython compila tu código Python directamente a Java bytecode y lo ejecuta sobre la máquina virtual de Java (JVM). Esto significa que puedes usar librerías de Java directamente desde Python.
# Con Jython puedes usar librerías Java directamente
from java.util import ArrayList
lista = ArrayList()
lista.add("hola desde Python")
lista.add("usando clases de Java")
print(lista)
💡 Útil si trabajas en un entorno Java y quieres aprovechar el ecosistema de ambos lenguajes.
IronPython — Python en .NET
IronPython hace lo mismo pero para el ecosistema de Microsoft .NET. Compila Python al lenguaje intermedio de .NET (IL) y lo ejecuta sobre el CLR (Common Language Runtime).
# Con IronPython puedes usar librerías .NET
import clr
clr.AddReference("System.Windows.Forms")
from System.Windows.Forms import MessageBox
MessageBox.Show("¡Hola desde Python en .NET!")
💡 Ideal para integrar Python en aplicaciones Windows que ya usan C# o VB.NET.
PyPy — Python más rápido
PyPy es una implementación alternativa de Python enfocada en velocidad. Usa una técnica llamada JIT (Just-In-Time compilation): en lugar de interpretar el byte code instrucción por instrucción como CPython, PyPy analiza qué partes de tu código se ejecutan más veces y las compila directamente a código máquina nativo.
💡 Para la mayoría de proyectos de principiantes, CPython es perfecto. PyPy brilla en programas que hacen muchos cálculos repetitivos (simulaciones, procesamiento masivo de datos).
Herramientas de optimización de ejecución
Cython — Lo mejor de dos mundos
Cython es una herramienta que te permite escribir código Python con algunas anotaciones de tipos, y compilarlo a código C nativo. El resultado es un archivo .so (en Linux/Mac) o .pyd (en Windows) que Python puede importar como si fuera un módulo normal.
# archivo: calculos.pyx (sintaxis Cython)
def suma_rapida(int a, int b): # nota los tipos "int"
return a + b
# Se compila a C y luego a código máquina
cython calculos.pyx
gcc -shared calculos.c -o calculos.so
# Y lo usas desde Python normal
python3 -c "import calculos; print(calculos.suma_rapida(3, 4))"
# 7
Shedskin — Python a C++ automático
Shedskin analiza tu código Python y lo traduce automáticamente a C++, compilándolo a un ejecutable nativo. A diferencia de Cython no necesitas anotar tipos manualmente — los infiere solo.
# calculos.py — Python normal
def suma_lista(lista):
total = 0
for n in lista:
total += n
return total
# Shedskin lo convierte a C++ y compila
shedskin calculos.py
make
./calculos # ejecutable nativo, muy rápido
⚠️ Shedskin solo soporta un subconjunto de Python y no todas las librerías. Es útil para partes muy específicas de tu código donde la velocidad es crítica.
Binarios congelados (Frozen Binaries)
¿Qué son?
Un binario congelado es un archivo ejecutable que contiene todo lo necesario para correr tu programa Python sin que el usuario tenga Python instalado:
- Tu código (en byte code)
- El intérprete de Python
- Todas las librerías que usas
Todo empaquetado en un solo archivo .exe (Windows), app (macOS) o binario (Linux).
Herramientas para crear binarios congelados
| Herramienta | Sistemas | Comando básico |
|---|---|---|
| PyInstaller | Win, Mac, Linux | pyinstaller --onefile main.py |
| cx_Freeze | Win, Mac, Linux | cxfreeze main.py |
| py2exe | Solo Windows | python setup.py py2exe |
| py2app | Solo macOS | python setup.py py2app |
# Ejemplo con PyInstaller (el más popular)
pip install pyinstaller
# Crear un solo ejecutable
pyinstaller --onefile mi_app.py
# El ejecutable quedará en la carpeta dist/
ls dist/
# mi_app (en Linux/Mac) o mi_app.exe (en Windows)
💡 Los binarios congelados son útiles cuando quieres distribuir tu programa a personas que no saben programar y no tienen Python instalado — como una aplicación de escritorio normal.
⚠️ El archivo resultante puede ser grande (30–100 MB) porque incluye el intérprete completo.
Otras opciones de ejecución
Además del modelo estándar, Python puede ejecutarse de otras formas menos conocidas pero muy útiles:
Modo interactivo (REPL)
El REPL (Read-Eval-Print Loop) es el intérprete interactivo que ya conoces. Puedes ejecutar código línea a línea sin crear un archivo.
python3
>>> 2 + 2
4
>>> nombre = "Ana"
>>> print(f"Hola {nombre}")
Hola Ana
>>> exit()
💡 Ideal para experimentar y aprender. Prueba una idea rápidamente antes de escribirla en un archivo.
Ejecución como módulo con -m
Python puede ejecutar módulos directamente con la opción -m:
# En lugar de escribir el path completo a un script
python3 -m http.server 8080 # levanta un servidor web simple
python3 -m json.tool archivo.json # formatea un JSON bonito
python3 -m venv mi-entorno # crea un entorno virtual
python3 -m pip install requests # instala un paquete
Código inline con -c
Puedes ejecutar una línea de Python directamente desde la terminal:
python3 -c "print('Hola sin crear archivo')"
# Hola sin crear archivo
python3 -c "import sys; print(sys.version)"
# 3.12.3 (main, ...)
Jupyter Notebooks
Jupyter es un entorno que permite mezclar código Python, texto explicativo, imágenes y gráficas en un solo documento interactivo .ipynb.
pip install jupyter
jupyter notebook
# Abre el navegador con un editor interactivo
💡 Muy popular en ciencia de datos, investigación y educación.
Posibilidades futuras
Python sigue evolucionando activamente. Algunas direcciones que se están explorando:
Subintérpretes y paralelismo real
Históricamente, Python tiene una limitación llamada GIL (Global Interpreter Lock): aunque tu computadora tenga muchos núcleos, Python solo puede ejecutar un hilo a la vez con el intérprete estándar. Los equipos de desarrollo están trabajando en subintérpretes que permitirían paralelismo real en CPython.
# Hoy (limitado por GIL)
import threading
# Los hilos comparten el mismo intérprete
# Futuro (en desarrollo con PEP 703)
# Cada subintérprete correría verdaderamente en paralelo
Python sin GIL (PEP 703)
La PEP 703 propone hacer el GIL opcional en CPython. En Python 3.13 ya existe como experimento:
# Python 3.13+ experimental
python3.13 -X nogil mi_programa.py
Compilación JIT nativa en CPython
CPython 3.13 incluye un compilador JIT experimental (similar a PyPy) que puede acelerar código Python sin necesidad de cambiar a otra implementación.
WebAssembly (Pyodide)
Pyodide permite ejecutar Python directamente en el navegador web a través de WebAssembly, sin necesidad de un servidor:
<!-- Python corriendo en el navegador -->
<script src="pyodide.js"></script>
<script>
pyodide.runPython(`
import sys
print(sys.version)
`);
</script>
Resumen: el viaje completo de tu código
Preguntas frecuentes
¿Necesito saber todo esto para programar en Python?
No. Como principiante solo necesitas saber que escribes un .py y lo ejecutas con python3. Todo lo demás ocurre automáticamente. Este conocimiento es útil cuando quieras entender por qué Python se comporta como lo hace o cuando necesites optimizar.
¿Por qué Python es más lento que C? Porque C se compila directamente a código máquina nativo, mientras que Python pasa por la capa extra de la PVM. Esta flexibilidad tiene un costo de velocidad, pero a cambio gana en portabilidad y facilidad de uso.
¿Qué es __pycache__ y puedo borrarlo?
Es la carpeta donde Python guarda los archivos .pyc. Puedes borrarla sin problema — Python la regenera la próxima vez que ejecutes tu código.
¿Debo aprender PyPy o Cython desde el principio? No. Empieza con CPython (el estándar). Solo cuando tengas un programa funcionando y notes que es lento, considera alternativas de optimización.
Ahora que entiendes cómo Python ejecuta tus programas por dentro, el siguiente paso es aprender los tipos de datos fundamentales: números, cadenas de texto, listas y diccionarios.
