logoalt Hacker News

Anecdotally, programmers dislike "reduce"

109 pointsby vinhnxlast Monday at 6:46 AM172 commentsview on HN

Comments

theamklast Monday at 5:41 PM

At least in Python, I've found that "reduce" is very rarely needed. Most of the times, "sum" is enough, sometimes with "start" values customized (set it to [] to flatten an array for example). It is both easier to read, faster, and needs no imports. It also works great with list comprehensions - "sum(foo(x) for x in input if x > 5)" is much easier to read than reduce equivalent.

If you are multiplying, you are likely doing heavy math, and you'll be using numpy - which does not need reduce either.

If you are going to return a list of dict, then it's much faster to mutate the results, so using "reduce" will have significant performance implications (unless you want to return input argument, mis-using it as a glorified "for" loop)

And if returning not a list/dict, if you can use "min" or "max" or "any" or "all" or "next" (take the first element), then you should use it - it will be easier to read and faster too.

So what does this leave us for "reduce"? Frankly, not much. I've only seen it in merging immutable status codes, and that was pretty niche usecase to begin with.

(this was all for Python. In other languages without nice list of built-ins reduce might make more sense)

show 2 replies
billyp-rvalast Monday at 7:37 PM

Well yeah, it's the lowest-level array function. All of the others can be written with reduce, but not vice-versa. Of course it's going to be less friendly.

eimrinelast Monday at 3:01 PM

Reduce requires knowing that the sum of zero entities is zero but the multiply of zero entities is one. They forget to throw the correct number and think that reduce() just do not work for them.

very-old-swyesterday at 11:59 PM

reduce with barriers is essential in parallel functional programming. See the CUDA thrust package.

g8ozlast Monday at 9:09 PM

I've always like reduce myself, didn't realize others had a negative attitude towards it.

mahboiyesterday at 10:21 PM

Reduce always makes me question the performance and order of operations. The most I'll do in Python is like

  sum(x[1] for x in args)
which is map + reduce. And that's only if x[1] is a number. That's about it. No equivalent in JS. Whenever some JS code has map, I'm like why, and rewrite it as a loop.

This is also assuming we're talking about regular code and not an actual map-reduce framework like Spark.

WesolyKubeczekyesterday at 6:46 PM

I like neither of the three and prefer for loops and if statements instead. Yay for shallower stacks!

scotty79yesterday at 10:11 PM

Alternative theory - reduce is badly named.

combine, accumulate it aggregate would have way more use.

mcphageyesterday at 7:39 PM

I like it, but don't care for the name. I find it easier to think about in terms of an accumulator.

jan_m_savagetoday at 1:18 AM

[dead]

fatih-erikli-cgyesterday at 9:52 PM

[dead]

semiinfinitelyyesterday at 6:30 PM

you guys still reading and review code with ur eyes and brain?

show 1 reply