itertools.accumulate: sumas y estados acumulados

Publicado el: 30/08/2026
Tempo de leitura: 2 minutos
Close-up of hands typing on a laptop keyboard, Python book in sight, coding in progress.

itertools.accumulate() produce resultados acumulados mientras recorre un iterable. Por defecto calcula sumas progresivas, pero también acepta multiplicación, máximo, mínimo o una transición de estado personalizada. Como devuelve un iterador, funciona bien en pipelines y streams grandes.

Esta guía cubre totales acumulados, initial, funciones de operator, saldos, récords progresivos, medias y riesgos con estado mutable.

Suma acumulada

from itertools import accumulate

valores = [10, 5, -2, 8]
print(list(accumulate(valores)))
# [10, 15, 13, 21]

Cada salida combina el acumulado anterior con el siguiente elemento.

Valor inicial

print(list(accumulate([5, 7, 3], initial=100)))
# [100, 105, 112, 115]

El valor inicial se emite primero, algo útil para saldos, posiciones y estados anteriores al primer evento.

Producto acumulado

from operator import mul

print(list(accumulate([2, 3, 4], mul)))
# [2, 6, 24]

Máximo progresivo

temperaturas = [18, 20, 19, 24, 22]
print(list(accumulate(temperaturas, max)))
# [18, 20, 20, 24, 24]

Saldos después de movimientos

movimientos = [200, -50, -25, 100]
saldos = accumulate(movimientos, initial=1000)
for saldo in saldos:
    print(saldo)

Transición personalizada

def limitar(actual, cambio):
    return max(0, actual + cambio)

estados = accumulate([-3, 8, -20, 5], limitar, initial=10)

La función recibe el estado acumulado y el siguiente elemento, y devuelve el nuevo estado.

Procesamiento lazy

accumulate calcula valores solo cuando se solicitan. Puede combinarse con islice, filtros y otras herramientas de itertools.

from itertools import accumulate, islice

primeros = islice(accumulate(eventos(), actualizar_estado), 100)

Media acumulada

def actualizar(estado, valor):
    total, cantidad = estado
    return total + valor, cantidad + 1

estados = accumulate([10, 20, 15], actualizar, initial=(0, 0))
medias = [total / cantidad for total, cantidad in estados if cantidad]

Preferir estados inmutables

Si la función modifica y devuelve la misma lista o diccionario, todos los resultados pueden referirse al mismo objeto. Usa tuplas, dataclasses frozen o copias explícitas.

accumulate frente a sum

sum devuelve únicamente el total final. accumulate expone cada estado intermedio.

accumulate frente a reduce

functools.reduce combina elementos, pero produce un único resultado. Elige accumulate cuando la evolución completa sea importante.

Precisión numérica

Las sumas largas de floats pueden acumular errores de redondeo. Para valores decimales usa decimal.Decimal. math.fsum puede mejorar un total final de floats, aunque no genera estados intermedios.

Errores comunes

  • Olvidar que initial añade una salida.
  • Invertir los argumentos de la función acumuladora.
  • Modificar el mismo objeto de estado.
  • Convertir un resultado infinito en lista.
  • Esperar un escalar en vez de un iterador.

Buenas prácticas

Mantén la transición pura, usa estados pequeños e inmutables, documenta el valor inicial y consume el iterador progresivamente. Consulta las guías internas de itertools, groupby y pairwise.

Conclusión

itertools.accumulate es una herramienta compacta para totales progresivos y transiciones de estado. Su diseño lazy permite pipelines de bajo consumo de memoria.

Fuentes externas

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    Carpetas y directorios para contextlib.chdir en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    contextlib.chdir: restaura directorios automáticamente

    Aprende contextlib.chdir en Python para cambiar directorios temporalmente, restaurar rutas y crear pruebas confiables sin errores de estado global.

    Ler mais

    Tempo de leitura: 6 minutos
    03/09/2026
    Monitoreo de rendimiento y ejecución de código Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    sys.monitoring: instrumentación de bajo overhead

    Aprende sys.monitoring en Python para instrumentar ejecución con bajo overhead, eventos selectivos, callbacks y observabilidad segura.

    Ler mais

    Tempo de leitura: 6 minutos
    03/09/2026
    Desarrollador organizando datos con operator.attrgetter en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    operator.attrgetter: ordena objetos por atributos

    Aprende operator.attrgetter en Python para ordenar, agrupar y transformar objetos por atributos simples o anidados con código claro.

    Ler mais

    Tempo de leitura: 4 minutos
    02/09/2026
    Programación asíncrona con asyncio.Runner en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    asyncio.Runner: reutiliza el event loop con seguridad

    Aprende asyncio.Runner en Python para reutilizar el event loop, controlar contexto, señales, debug, cancelación y cierre asíncrono seguro.

    Ler mais

    Tempo de leitura: 7 minutos
    02/09/2026
    Compresión de datos binarios con Zstandard en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    compression.zstd: Zstandard con streams y diccionarios

    Aprende compression.zstd en Python para comprimir datos con Zstandard, streaming, diccionarios y límites seguros.

    Ler mais

    Tempo de leitura: 7 minutos
    01/09/2026
    Aplicación Python empaquetada como archivo ejecutable con zipapp
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    zipapp en Python: crea apps ejecutables

    Aprende zipapp en Python para empaquetar aplicaciones como archivos pyz ejecutables, incluir dependencias y distribuirlas con seguridad.

    Ler mais

    Tempo de leitura: 5 minutos
    01/09/2026