2013-01-03 49 views
13

Trong Python 3.3, itertools.accumulate(), thường liên tục áp dụng thao tác bổ sung cho vòng lặp được cung cấp, bây giờ có thể lấy đối số hàm làm tham số; điều này có nghĩa là nó trùng lặp với functools.reduce(). Với một cái nhìn lướt qua, những khác biệt chính giữa hai bây giờ sẽ dường như là:itertools.accumulate() so với functools.reduce()

  1. accumulate() mặc định là tổng hợp nhưng không cho phép bạn cung cấp một điều kiện ban đầu thêm một cách rõ ràng trong khi reduce() không mặc định bất kỳ phương pháp nhưng không cho phép bạn cung cấp một điều kiện ban đầu để sử dụng với 1/chuỗi 0 phần tử, và 2)
  2. accumulate() lấy iterable đầu tiên trong khi reduce() mất chức năng đầu tiên

có bất kỳ sự khác biệt khác giữa hai? Hay đây chỉ là vấn đề về hành vi của hai chức năng với việc sử dụng riêng biệt ban đầu bắt đầu hội tụ theo thời gian?

+1

tích lũy thực hiện quét https://en.wikipedia.org/wiki/Prefix_sum trong khi giảm hiệu suất gấp https://en.wikipedia.org/wiki/Fold_(higher-order_function) –

Trả lời

17

Dường như accumulate giữ kết quả trước đó, trong khi reduce (được gọi là gấp bằng các ngôn ngữ khác) không nhất thiết.

ví dụ: list(accumulate([1,2,3], operator.plus)) sẽ trở [1,3,6] trong khi một lần đơn giản sẽ trở lại 6

Ngoài ra (chỉ để cho vui, không làm điều này), bạn có thể định nghĩa accumulate về reduce

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

Tôi đoán bạn có nghĩa là toán tử ' .add'. Ngoài ra, tôi không biết liệu đoạn cuối có thực sự hữu ích hay không: 1) nó trả về một danh sách trong khi 'itertools.accumulate' trả về một iterable, 2) nó vô cùng hiệu quả :) – tokland

6

Bạn có thể thấy trong tài liệu gì sự khác biệt là. reduce trả về kết quả đơn, tổng, sản phẩm, v.v. của chuỗi. accumulate trả về một trình lặp trên tất cả kết quả trung gian. Về cơ bản, accumulate trả về một trình lặp trên kết quả của mỗi bước của hoạt động reduce.

2

itertools.accumulate giống như reduce nhưng trả về trình tạo * thay vì giá trị. Máy phát điện này có thể cung cấp cho bạn tất cả các giá trị bước trung gian. Vì vậy, về cơ bản giảm cung cấp cho bạn những yếu tố cuối cùng của những gì tích lũy sẽ cung cấp cho bạn.

* Trình tạo giống như một trình lặp nhưng có thể được lặp lại chỉ một lần.