|
215 | 215 | "Ver `README.md` — entrega un notebook con benchmark `%timeit` comparando `sum(range(N))` vs `np.arange(N).sum()` para N=10k/100k/1M, tabla y gráfico." |
216 | 216 | ] |
217 | 217 | }, |
| 218 | + { |
| 219 | + "cell_type": "markdown", |
| 220 | + "metadata": {}, |
| 221 | + "source": [ |
| 222 | + "## 📖 Definiciones y características\n", |
| 223 | + "\n", |
| 224 | + "**Kernel**\n", |
| 225 | + "\n", |
| 226 | + "Proceso Python (u otro lenguaje) que ejecuta el código de las celdas. Vive separado del frontend; si lo matas, pierdes el estado en memoria pero los archivos siguen intactos. Cada notebook se asocia a UN kernel, normalmente el del venv del proyecto.\n", |
| 227 | + "\n", |
| 228 | + "**Frontend**\n", |
| 229 | + "\n", |
| 230 | + "La interfaz visual (Notebook clásico, JupyterLab, VS Code, Cursor, Colab). Todas hablan el mismo protocolo con el kernel — puedes cambiar de frontend sin perder datos si guardas el `.ipynb`.\n", |
| 231 | + "\n", |
| 232 | + "**Magic**\n", |
| 233 | + "\n", |
| 234 | + "Comando especial de IPython, no de Python. Empieza con `%` (afecta una línea) o `%%` (afecta la celda entera). Ejemplos: `%timeit`, `%matplotlib inline`, `%%time`, `%debug`. No funcionan fuera de IPython/Jupyter.\n", |
| 235 | + "\n", |
| 236 | + "**`%timeit` vs `%%time`**\n", |
| 237 | + "\n", |
| 238 | + "`%timeit` corre la expresión **muchas veces**, descarta outliers y reporta el mejor → microbenchmark estadísticamente serio. `%%time` mide **una sola corrida** del bloque → bueno para operaciones largas donde repetir cuesta. Característica clave: usa `%timeit` para algo en milisegundos, `%%time` para algo en segundos.\n", |
| 239 | + "\n", |
| 240 | + "**pdb / `%debug`**\n", |
| 241 | + "\n", |
| 242 | + "Debugger interactivo de Python. `%debug` lo lanza en modo **post-mortem** después de una excepción — entras al stack en el punto del error sin re-correr nada. Comandos: `n` siguiente línea, `s` entra a función, `c` continúa, `p var` imprime, `u/d` sube/baja en stack, `q` salir." |
| 243 | + ] |
| 244 | + }, |
| 245 | + { |
| 246 | + "cell_type": "markdown", |
| 247 | + "metadata": {}, |
| 248 | + "source": [ |
| 249 | + "## ⚠️ Errores comunes\n", |
| 250 | + "\n", |
| 251 | + "| Síntoma / mensaje | Causa y cómo arreglar |\n", |
| 252 | + "|---|---|\n", |
| 253 | + "| `ModuleNotFoundError` aunque acabo de instalar el paquete | El kernel activo NO es el venv donde corriste `pip install`. **Fix**: en una celda, `import sys; print(sys.executable)` — si no apunta a tu venv, cambia el kernel (menú Kernel → Change Kernel) o registra el venv con `python -m ipykernel install --user --name <nombre>`. |\n", |
| 254 | + "| El notebook está \"congelado\" / la barra dice `[*]` | Una celda quedó atrapada en bucle infinito o esperando input. **Fix**: menú Kernel → Interrupt (Esc + I dos veces). Si no responde, Restart Kernel — perderás variables en memoria pero los archivos quedan intactos. |\n", |
| 255 | + "| Cambié código de un módulo importado y el notebook ignora el cambio | Python cachea módulos importados. **Fix**: `%load_ext autoreload` + `%autoreload 2` al inicio del notebook; recarga automáticamente al ejecutar. |\n", |
| 256 | + "| `%timeit` en una celda con asignación da error \"NameError\" | Las variables creadas dentro de `%timeit` **no quedan** en el namespace (corre en sandbox). **Fix**: usa `%%timeit` (cell magic) si quieres preservar variables, o asigna fuera de la magic. |\n", |
| 257 | + "| Outputs gigantes hacen el .ipynb pesado y el diff de git ilegible | Cada output (imagen, tabla) queda guardado en el JSON del notebook. **Fix**: pre-commit hook con `nbstripout` (limpia outputs antes de commitear) o `Cell → All Output → Clear` antes de guardar. |" |
| 258 | + ] |
| 259 | + }, |
| 260 | + { |
| 261 | + "cell_type": "markdown", |
| 262 | + "metadata": {}, |
| 263 | + "source": [ |
| 264 | + "## ❓ Preguntas frecuentes\n", |
| 265 | + "\n", |
| 266 | + "**❓ ¿Notebook clásico o JupyterLab o VS Code?**\n", |
| 267 | + "\n", |
| 268 | + "Para aprender, **VS Code** (mismo backend, mejor UX: autocomplete con type hints, debug gráfico, git inline). Para reuniones colaborativas en navegador, JupyterLab. El Notebook clásico es legacy — sigue funcionando pero ya no recibe features.\n", |
| 269 | + "\n", |
| 270 | + "**❓ ¿Debo crear un kernel por proyecto o usar uno global?**\n", |
| 271 | + "\n", |
| 272 | + "**Uno por proyecto.** Cada proyecto tiene dependencias distintas que entran en conflicto: el kernel global tarde o temprano se rompe. Comando: `python -m ipykernel install --user --name <proyecto>`.\n", |
| 273 | + "\n", |
| 274 | + "**❓ ¿Cuándo `%timeit` no es confiable?**\n", |
| 275 | + "\n", |
| 276 | + "Cuando lo que mides toca disco/red/GPU — la varianza es enorme y el min no representa típico. Usa `%%time` con varios runs manuales y reporta mediana. Tampoco confiable si la primera corrida hace JIT (numba) — calienta con un run previo.\n", |
| 277 | + "\n", |
| 278 | + "**❓ `%debug` no funciona, no muestra prompt**\n", |
| 279 | + "\n", |
| 280 | + "Necesita haber ocurrido una excepción **en el kernel** justo antes. Si la celda falló pero el kernel se reinició, perdiste el stack. También: en VS Code Jupyter, usa el panel de debug en su lugar (más cómodo).\n", |
| 281 | + "\n", |
| 282 | + "**❓ ¿Por qué mi notebook tarda 30 segundos en abrir si pesa solo 200 KB?**\n", |
| 283 | + "\n", |
| 284 | + "Probablemente trae outputs binarios grandes (imágenes inline en base64). El JSON parece chico pero al renderizar el navegador procesa MB. Limpia outputs y guarda." |
| 285 | + ] |
| 286 | + }, |
218 | 287 | { |
219 | 288 | "cell_type": "markdown", |
220 | 289 | "metadata": {}, |
|
0 commit comments