Das mit `accumulate()` funktioniert genau so wie Du das Ergebnis beschreibst, es ist immer das bisher grösste Element aus dem ursprünglichen „iterable“:
Code: Alles auswählen
In [59]: list(itertools.accumulate([1, 3, 2], max))
Out[59]: [1, 3, 3]
In [60]: list(itertools.accumulate([3, 2, 1], max))
Out[60]: [3, 3, 3]
In [61]: list(itertools.accumulate([1, 2, 3], max))
Out[61]: [1, 2, 3]
Mit `itertools` kann man nicht ”slicen”, also kann man das damit auch nicht schneller machen. Bei dem `accumulate()`-Beispiel *vermeidet* man damit das ”slicen”, insbesondere das bei Deinem Code für jedes Element in der ursprünglichen Liste ein geslicet wurde und der Slice bei jedem Element alle vorherigen umfasste, also immer grösser wurde, was die Geschichte an der Stelle dann O(n²) macht, während `accumulate()` jedes Element genau einmal anfasst, also mit linearer Laufzeit- und Speicherkomplexität (O(n)) auskommt. Das heisst nicht zwangsläufig, dass es für die konkreten Werte schneller ist, aber es skaliert auf jeden Fall besser.
Wenn man etwas mit quadratischer Laufzeit macht weil das schneller ist als etwas äquivalentes mit linearer Laufzeit, dann würde ich das zumindest mit einem Kommentar dokumentieren, weil das eine Stelle ist die man sich anschauen sollte wenn sich an der Umgebung was ändert. Beispielsweise wenn eine neue Python-Version heraus kommt, oder man das mit einer anderen Python-Implementierung ausführt.
Ansonsten verwendet man Iteratoren/Generatoren eher nicht um etwas insgesamt schneller zu machen, sondern um Speicher zu sparen. Manchmal auch um Berechnungen zu sparen. Und Teilergebnisse sind damit oft schneller verfügbar, auch wenn vielleicht die Gesamtrechenzeit etwas höher wird.