Por qué vectorizar en Python
La misma suma de tres maneras, y la razón por la que numpy existe.
import timeit
import numpy as np
valores = np.arange(100_000, dtype=np.float64)
def con_bucle():
total = 0.0
for valor in valores:
total += valor
return total
def con_numpy():
return valores.sum()
bucle = timeit.timeit(con_bucle, number=3) / 3
rapido = timeit.timeit(con_numpy, number=3) / 3
print(f"bucle {bucle * 1000:.1f} ms")
print(f"numpy {rapido * 1000:.3f} ms")
print(f"{bucle / rapido:.0f}x")
Cómo funciona
- Un bucle de Python paga costo de intérprete por elemento.
- Una ufunc hace el bucle en código compilado.
timeitsobre un arreglo chico puede engañar: mide con el tamaño real.
Palabras clave y builtins usados aquí
asdefforprintreturn
El intento, en números
- Líneas
- 23
- Caracteres a escribir
- 408
- Tokens
- 122
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 67 segundos.
Paso 4 de 4 en Matemática y memoria; paso 19 de 22 en NumPy.