Reference counting y GC generacional en CPython
Cómo CPython gestiona memoria con ob_refcnt, por qué las referencias circulares crean leaks y cómo el módulo gc los detecta con un collector generacional de tres niveles.
Cómo CPython gestiona memoria con ob_refcnt, por qué las referencias circulares crean leaks y cómo el módulo gc los detecta con un collector generacional de tres niveles.
Cómo usar dis para desensamblar funciones Python, entender LOAD_FAST vs LOAD_GLOBAL, y verificar que tus optimizaciones existen en bytecode real.
Cómo CPython transforma código fuente en bytecode ejecutable: tokenización, AST, compilación, caché `.pyc` e inspección con `dis`.
Cuándo y cómo usar Cython, Numba y mypyc para eliminar el overhead del intérprete CPython en código de alto rendimiento, con sus trade-offs reales.
Cómo y cuándo delegar operaciones numéricas a NumPy para ejecutar código C en lugar de bytecode Python, con vectorización y broadcasting.
LOAD_FAST vs LOAD_GLOBAL, attribute lookup, join vs +=, comprehensions y estructuras O(1): técnicas concretas para hot paths identificados con profiling.
Flujo completo de medición con timeit, perf_counter y cProfile para identificar hot paths reales antes de tocar el código.
Cómo usar tracemalloc para comparar snapshots del heap, localizar leaks por línea de código y rastrear referencias vivas con gc.get_referrers.
Cómo medir dónde gasta tiempo tu código con cProfile en desarrollo y py-spy en producción, leyendo correctamente tottime vs cumulative.
Cómo pausar la ejecución de Python con `breakpoint()` y navegar el estado del programa usando los comandos fundamentales de `pdb`.