Skip to content

English · Español

Fase 6 — Quizzes

Espejo legible de data/quizzes/phase-06-python-engineering.yaml. Las preguntas se centran en el modelo de memoria de NumPy (strides, broadcasting) y los matices de tipos.

Fuente de verdad: data/quizzes/phase-06-python-engineering.yaml.


q-06-01 — ¿Por qué la transpuesta es O(1)?

  1. NumPy crea perezosamente un nuevo buffer en el primer acceso.
  2. La transpuesta devuelve una vista que comparte el buffer; solo se intercambian shape y strides. La trampa: el resultado ya no es C-contiguo.
  3. NumPy usa copy-on-write como los procesos Linux.
  4. La transpuesta está en C y es siempre rápida.
Respuesta **Opción 2.** `(shape, strides)` cambia de `((3,4),(16,4))` a `((4,3),(4,16))`. El flag `C_CONTIGUOUS=False` es la trampa — el código que asume row-major se degrada silenciosamente.

q-06-02 — Broadcasting (opción múltiple)

  1. Los shapes se alinean desde el eje final.
  2. Dos dimensiones son compatibles si son iguales o si una es 1.
  3. Un eje de tamaño 1 se replica virtualmente.
  4. (3,) hace broadcast contra (4, 3)(4, 3).
  5. (3,) hace broadcast contra (3, 4)(3, 4).
Respuesta **Opciones 1, 2, 3, 4.** La opción 5 falla: `(3,)` se alinea al eje final (tamaño 4), incompatible. Hay que reshapear a `(3, 1)` para hacer broadcast contra `(3, 4)`.

q-06-03 — Cálculo de offset en bytes (libre)

int32, shape (3, 4), strides (16, 4). ¿Offset en bytes del elemento (2, 3)?

Respuesta `offset = 2 · 16 + 3 · 4 = 32 + 12 = `**44** bytes.

q-06-04 — GIL y trabajo CPU-bound (libre)

Respuesta `matmul` de NumPy **libera el GIL** durante la llamada a BLAS — el trabajo pesado corre en C sin el lock y los hilos paralelizan. Los bucles de Python puro mantienen el GIL en cada operación de bytecode, así que los hilos serializan; para trabajo CPU-bound en Python puro, usa multiprocessing.

q-06-05 — Any y mypy --strict

  1. Any es asignable a y desde todo; en cuanto un valor es Any, mypy no puede razonar sobre las operaciones que se le aplican. Implicación práctica: los mejores stubs de numpy 2.x permiten usar NDArray[float32], pero los retornos heredados de tipo Any pierden la información de tipos en la frontera.
  2. Any es sinónimo de None.
  3. mypy --strict ignora Any.
  4. numpy está escrito en C y no tiene tipos.
Respuesta **Opción 1.** `Any` es la vía de escape universal — cualquier operación sobre un `Any` es también `Any`. Anota explícitamente y estrecha los tipos en las fronteras de librería.