Recapitulación de collections, itertools y functools
Tres módulos de la biblioteca estándar forman el kit de herramientas de datos de Python: collections (contenedores especializados), itertools (álgebra de iteradores), functools (funciones de orden superior). Domina un pequeño subconjunto antes de recurrir a PyPI.
Receta
from collections import Counter, defaultdict
from functools import lru_cache
from itertools import islice, chain
@lru_cache(maxsize=128)
def fib(n: int) -> int:
return n if n < 2 else fib(n - 1) + fib(n - 2)
counts = Counter(chain.from_iterable(["a", "b", "a"]))Cuándo recurrir a esto:
- Contar frecuencias -> Counter
- Agrupar -> defaultdict, itertools.groupby
- Memoización -> lru_cache
- Procesar datos grandes en streaming -> itertools chain/islice
- Despacho de un solo argumento (single-dispatch) -> functools.singledispatch
Ejemplo de trabajo
from collections import Counter, deque
from functools import partial
from itertools import groupby
def top_n(words: list[str], n: int = 3) -> list[tuple[str, int]]:
return Counter(words).most_common(n)
def sliding_window(iterable, size: int):
window = deque(maxlen=size)
for item in iterable:
window.append(item)
if len(window) == size:
yield tuple(window)
def group_sorted(rows: list[tuple[str, int]]):
for key, group in groupby(sorted(rows), key=lambda r: r[0]):
yield key, list(group)
words = ["api", "api", "cli", "ui", "api"]
print(top_n(words))
print(list(sliding_window(range(6), 3)))
print(list(group_sorted([("a", 1), ("a", 2), ("b", 3)])))
double = partial(pow, 2)
print(double(5))Lo que esto demuestra:
- Counter para recuentos sin incrementos manuales de diccionario
- deque con maxlen para ventanas deslizantes O(1)
- groupby requiere entrada ordenada para agrupar todas las claves
- partial fija los argumentos de la llamada de la izquierda
Profundización
Puntos destacados de collections
| Tipo | Uso |
|---|---|
| deque | Extremos FIFO/LRU |
| Counter | Recuentos de multiconjuntos |
| defaultdict | Claves faltantes por defecto |
| namedtuple | Registros ligeros (dataclass a menudo mejor) |
Puntos destacados de itertools
chain,islice,batched(3.12+)- Combinatoria
product,permutations - Perezoso - amigable con la memoria
Puntos destacados de functools
lru_cache,cache(3.9+ sin límites)singledispatch,wrapspara decoradores
Trampas
- Entrada no ordenada de groupby - divide la misma clave dos veces. Solución: ordenar primero o usar defaultdict.
- Argumentos mutables de lru_cache - los parámetros de diccionario/lista no hasheables fallan. Solución: claves de tupla o deshabilitar la caché.
- itertools infinitos sin islice - bucles infinitos. Solución: limitar el consumo.
- Recuentos negativos de Counter - permitidos pero confusos. Solución: usar solo rutas de incremento.
- Uso prematuro de more-itertools - stdlib batched/islice cubre muchos casos en 3.12+.
Alternativas
| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| dataclasses | Registros estructurados | Conteo puro |
| pandas | Estadísticas por columnas | Pequeños recuentos en memoria |
| more-itertools | Recetas adicionales | Política de solo stdlib |
Preguntas frecuentes
¿most_common de Counter?
Heap eficiente para las frecuencias top-k.
¿deque vs cola de lista?
deque O(1) saca de la izquierda; list.pop(0) es O(n).
¿cache vs lru_cache?
cache sin límites - solo para espacio de argumentos pequeño y finito.
¿itertools.batched?
3.12+ agrupa un iterable en tuplas de tamaño n - reemplaza bucles zip manuales.
¿namedtuple todavía?
Tuplas ligeras inmutables - dataclasses a menudo más claras para código nuevo.
¿reduce?
Disponible pero los bucles explícitos a menudo son más legibles en Python.
¿chain.from_iterable?
Aplana una lista de listas sin copia.
¿singledispatchmodule?
Ver la página de patrones de Python para el despacho basado en tipos.
¿Rendimiento?
itertools es perezoso; Counter está implementado en C - rápido para tamaños típicos.
¿Dónde hay cobertura más profunda?
Ver las secciones de estructuras de datos e iteradores-generadores para un tratamiento extendido.
Relacionado
- dataclasses, enum y contextlib - registros
- Los Patrones Strategy y Dispatch - singledispatch
- Descripción general de la biblioteca estándar - mapa
- Mejores prácticas de la biblioteca estándar - reglas del kit de herramientas
Versiones de la pila: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ y uv 0.6+.