2013-01-03 11 views
13

W języku Python 3.3, itertools.accumulate(), który zwykle wielokrotnie dodaje operację dodawania do podanej iteracji, może teraz przyjmować argument funkcji jako parametr; oznacza to, że teraz pokrywa się z functools.reduce(). Z pobieżnym spojrzeniem, główne różnice między tymi dwoma teraz wydaje się być:itertools.accumulate() versus functools.reduce()

  1. accumulate() domyślne do zsumowanie ale nie pozwalają dostarczyć dodatkowy warunek wstępny wyraźnie podczas reduce() nie zalega z dowolnym sposobem, ale nie pozwalają dostarczyć wstępny warunek do zastosowania z sekwencjami 0 1/pierwiastków, oraz 2)
  2. accumulate() bierze iterable pierwszy podczas reduce() zajmuje pierwsze funkcję

Czy są jakieś inne różnice między nimi? Czy jest to tylko kwestia zachowania dwóch funkcji z początkowo odrębnymi zastosowaniami, które zaczynają zbiegać się w czasie?

+1

akumuluje wykonuje skan https://en.wikipedia.org/wiki/Prefix_sum podczas gdy redukuje wykonuje fałdę https://en.wikipedia.org/wiki/Fold_(higher-order_function) –

Odpowiedz

17

Wygląda na to, że accumulate zachowuje poprzednie wyniki, podczas gdy reduce (który jest znany jako zakładka w innych językach) niekoniecznie.

np. list(accumulate([1,2,3], operator.plus)) wróci [1,3,6] natomiast zwykły krotnie wróci 6

także (tylko dla zabawy, nie rób tego) można zdefiniować accumulate pod względem reduce

def accumulate(xs, f): 
    return reduce(lambda a, x: a + [f(a[-1], x)], xs[1:], [xs[0]]) 
+2

Chyba masz na myśli 'operator .add'. Ponadto nie wiem, czy ostatni fragment jest naprawdę pomocny: 1) zwraca listę, podczas gdy 'itertools.accumulate' zwraca wartość iterowalną, 2) jest strasznie nieefektywna :) – tokland

6

można zobaczyć w dokumentacji, co różnica jest. reduce zwraca pojedynczy wynik , sumę, produkt itp. Sekwencji. accumulate zwraca Iterator ponad wszystkie pośrednich wyników. Zasadniczo, accumulate zwraca iterator nad wynikami każdego kroku operacji reduce.

2

itertools.accumulate jest jak reduce, ale zwraca generator * zamiast wartości. Ten generator może dać wszystkie pośrednie wartości kroku. Zasadniczo redukcja daje ci ostatni element tego, co daje ci akumulacja.

* Generator jest jak iterator, ale można go powtórzyć tylko raz.