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
森栏
您应该使用
TA贡献1810条经验 获得超5个赞
您应该使用map
而filter
不是列表推导。
即使它们不是“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
不在同一范围内。
只是在我将内部块移动到代码的不同部分后才出现问题(读取:维护期间出现问题,而不是开发),我没想到。
是的,如果你从未犯过这个错误,那么列表理解就更优雅了。
但是从个人经验(以及看到其他人犯同样的错误)我已经看到它发生了足够多次,我认为当这些错误蔓延到你的代码中时,你不得不经历这种痛苦。
结论:
使用map
和filter
。它们可以防止难以诊断的与范围相关的细微错误。
边注:
不要忘记考虑使用imap
和ifilter
(in itertools
)它们是否适合您的情况!
添加回答
举报
0/150
提交
取消