为了账号安全,请及时绑定邮箱和手机立即绑定

列表理解与地图

列表理解与地图

LEATH 2019-05-28 16:26:44
列表理解与地图是否有理由更喜欢使用map()超过列表理解,反之亦然?它们中的任何一个通常比另一个更有效或被认为是更加pythonic?
查看完整描述

3 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

map在某些情况下(当你没有为此目的制作lambda,但在map和listcomp中使用相同的函数时)可能在显微镜下更快。在其他情况下,列表推导可能更快,并且大多数(并非所有)pythonistas认为它们更直接和更清晰。

使用完全相同的功能时,地图的微小速度优势的一个例子:

$ python -mtimeit -s'xs=range(10)' 'map(hex, xs)'100000 loops, best of 3: 4.86 usec per loop
$ python -mtimeit -s'xs=range(10)' '[hex(x) for x in xs]'100000 loops, best of 3: 5.58 usec per loop

当map需要lambda时,如何完全颠倒性能比较的示例:

$ python -mtimeit -s'xs=range(10)' 'map(lambda x: x+2, xs)'100000 loops, best of 3: 4.24 usec per loop
$ python -mtimeit -s'xs=range(10)' '[x+2 for x in xs]'100000 loops, best of 3: 2.32 usec per loop


查看完整回答
反对 回复 2019-05-28
?
森栏

TA贡献1810条经验 获得超5个赞

您应该使用mapfilter不是列表推导。

即使它们不是“Pythonic”,你应该更喜欢它们的客观原因是:
它们需要函数/ lambdas作为参数,这引入了一个新的范围

我不止一次被这个咬过了:

for x, y in somePoints:
    # (several lines of code here)
    squared = [x ** 2 for x in numbers]
    # Oops, x was silently overwritten!

但如果相反我说:

for x, y in somePoints:
    # (several lines of code here)
    squared = map(lambda x: x ** 2, numbers)

那么一切都会好起来的。

你可以说我在同一范围内使用相同的变量名称是愚蠢的。

我不是。代码原本很好 - 两个x不在同一范围内。
只是在我内部块移动到代码的不同部分后才出现问题(读取:维护期间出现问题,而不是开发),我没想到。

是的,如果你从未犯过这个错误,那么列表理解就更优雅了。
但是从个人经验(以及看到其他人犯同样的错误)我已经看到它发生了足够多次,我认为当这些错误蔓延到你的代码中时,你不得不经历这种痛苦。

结论:

使用mapfilter。它们可以防止难以诊断的与范围相关的细微错误。

边注:

不要忘记考虑使用imapifilter(in itertools)它们是否适合您的情况!


查看完整回答
反对 回复 2019-05-28
  • 3 回答
  • 0 关注
  • 447 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信