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
initialañ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.







