Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

It's really weird to me that the author prefers map(add, ...) to sum(generator expression).


Because with map you can use any function and sum maps __add__. It also illustrates passing functions as arguments.

More subtly, a generator (or list comprehension) implies the order in which the results are generated and an implicit but observable changing state. If I'm trying to write (or, at least, express, since we are talking about Python) parallelism, map would be a better choice.


More subtly, a generator (or list comprehension) implies the order in which the results are generated and an implicit but observable changing state. If I'm trying to write (or, at least, express, since we are talking about Python) parallelism, map would be a better choice.

This is definitely not true -- generator expressions can be expressed using lazy list semantics. By your logic every Haskell list comprehension would be stateful.

I would encourage you to write the denotational or operational semantics of your expressions in these matters rather than simply going by intuition.


> generator expressions can be expressed using lazy list semantics

That does not change the fact the results are given in a certain order. Lazy list semantics means the data will be calculated as it's needed, therefore, the calculation cannot be parallelized.



I was talking about Python. A list comprehension is defined as having the behavior of a loop.


Once again, that doesn't semantically make a difference, unless the loop is side-effecting. However, even without side effects, Python cannot necessarily make any kind of guarantee about such computations since arrays are mutable and can be modified out from under the map.

This is why parmap equivalents take iterables in Python, not arrays. It doesn't matter if you have lazy or eager semantics, only if your semantics are side-effecting.


It's `reduce(add, map(int, ...))`.

It's more general than `sum(generator)` - you could write `reduce(mul, ...)` or anything else, while with sum you'll get sum and nothing more. Also, I have no problem with `reduce(some_fun, (x for x in iterable))`, which works too.

Generally, while `map` in python is much better written as list comprehension or generator expression, reduce has no equivalent short of explicit loop with accumulator variable.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: