开发者

imap and ifilter vs. generator comprehensions

I'm curious about the insignificant technical details -- differences between these two in python's internal representati开发者_运维知识库on, performance and stuff like that.


Generally, using map and filter is discouraged, but you are mapping-filtering by just one function, they are useful. But never use map or filter with lambda Consider this:

Places where filter or map is better:

(i for i in iterable if i), filter(bool, i)
(int(i) for i in iterable), map(int, i)

See, they are simplier. But, consider this:

(i+3 for i in iterable), map(lambda i: i+3, iterable)
(i for i in iterable if i.isdigit()), filter(lambda i, i.isdigit(), iterable)

And one advantage for generator expressions, you can mix map and filter functionality.

(f(i) for i in iterable if g(i)), map(f, filter(g, iterable))

For me the rules are:

  • Never use lambda in map or filter.
  • Only use map or filter if it's obvious what you are doing.
  • For everything else, use generator expressions.
  • If in doubt, use generator expressions.

Edit:

Forgot one important thing:

On Python versions older than 3, map(and filter) is eager, so it's better compare it with list comprehensions. But on Python 3, map is lazy, it acts like generator expressions.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜