2013-01-03 3 views
13

В Python 3.3, itertools.accumulate(), который обычно повторно применяет операцию добавления к поставляемому итерабельному, теперь может принимать аргумент функции в качестве параметра; это означает, что теперь он перекрывается с functools.reduce(). При беглом взгляде, основные различия между ними сейчас, казалось бы:itertools.accumulate() versus functools.reduce()

  1. accumulate() по умолчанию для суммирования, но не позволяет поставить дополнительное начальное условие в явном виде, а reduce() не по умолчанию любым способом, но делает позволяют поставить начальное условие для использования с 1/последовательностей 0-элементных и 2)
  2. accumulate() принимает итерацию первый в то время как reduce() принимает функцию первого

существуют ли другие различия между этими двумя? Или это просто вопрос поведения двух функций, изначально отличающихся друг от друга, начинающих со временем сходиться?

+1

накапливает выполняет проверку https://en.wikipedia.org/wiki/Prefix_sum, а сокращение выполняет сгиб https://en.wikipedia.org/wiki/Fold_(higher-order_function) –

ответ

17

Кажется, что accumulate сохраняет предыдущие результаты, тогда как reduce (который известен как сгиб на других языках) необязательно.

например. list(accumulate([1,2,3], operator.plus)) вернется [1,3,6], тогда как обычная складка будет возвращать 6

также (только для развлечения, не делайте этого) вы можете определить accumulate с точки зрения reduce

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

Я думаю, вы имеете в виду 'operator .add'. Кроме того, я не знаю, действительно ли последний фрагмент полезен: 1) он возвращает список, в то время как 'itertools.accumulate' возвращает итерируемый, 2) он ужасно неэффективен :) – tokland

6

Вы можете увидеть в документации, что разница есть. reduce возвращает одиночный результат, сумму, продукт и т. Д. Последовательности. accumulate возвращает итератор за все промежуточные результаты. В основном, accumulate возвращает итератор по результатам каждого шага операции reduce.

2

itertools.accumulate как reduce, но возвращает генератор * вместо значения. Этот генератор может дать вам все промежуточные значения шага. Таким образом, в основном сокращение дает вам последний элемент того, что накопление даст вам.

* Генератор похож на итератор, но может повторяться только один раз.