Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the problem with reduce()?

There seems to be a lot of heated discussion on the net about the changes to the reduce() function in python 3.0 and how it should be removed. I am having a little difficulty understanding why this is the case; I find it quite reasonable to use it in a variety of cases. If the contempt was simply subjective, I cannot imagine that such a large number of people would care about it.

What am I missing? What is the problem with reduce()?

like image 606
jeremy Avatar asked Oct 08 '08 06:10

jeremy


People also ask

Why was reduce removed from Python?

The arguments against reduce are that it tends to be misapplied, harms readability and doesn't fit in with the non-functional orientation of Python.

What does reduce () do in Python?

Python's reduce() is a function that implements a mathematical technique called folding or reduction. reduce() is useful when you need to apply a function to an iterable and reduce it to a single cumulative value.

What is the use of reduce () function?

The reduce() method executes a reducer function for array element. The reduce() method returns a single value: the function's accumulated result. The reduce() method does not execute the function for empty array elements. The reduce() method does not change the original array.

Is reduce faster than for loop Python?

Indeed, the reduce is much faster than the for when using iadd in the for.


2 Answers

As Guido says in his The fate of reduce() in Python 3000 post:

So now reduce(). This is actually the one I've always hated most, because, apart from a few examples involving + or *, almost every time I see a reduce() call with a non-trivial function argument, I need to grab pen and paper to diagram what's actually being fed into that function before I understand what the reduce() is supposed to do. So in my mind, the applicability of reduce() is pretty much limited to associative operators, and in all other cases it's better to write out the accumulation loop explicitly.

There is an excellent example of a confusing reduce in the Functional Programming HOWTO article:

Quick, what's the following code doing?

total = reduce(lambda a, b: (0, a[1] + b[1]), items)[1] 

You can figure it out, but it takes time to disentangle the expression to figure out what's going on. Using a short nested def statements makes things a little bit better:

def combine (a, b):     return 0, a[1] + b[1]  total = reduce(combine, items)[1] 

But it would be best of all if I had simply used a for loop:

total = 0 for a, b in items:     total += b 

Or the sum() built-in and a generator expression:

total = sum(b for a,b in items) 

Many uses of reduce() are clearer when written as for loops.

like image 55
DzinX Avatar answered Oct 03 '22 21:10

DzinX


reduce() is not being removed -- it's simply being moved into the functools module. Guido's reasoning is that except for trivial cases like summation, code written using reduce() is usually clearer when written as an accumulation loop.

like image 28
John Millikin Avatar answered Oct 03 '22 22:10

John Millikin