列表理解与地图

列表理解与地图

是否有理由更喜欢使用map()超过列表理解,反之亦然?它们中的任何一个通常比另一个更有效或被认为是更加pythonic?



LEATH
浏览 448回答 3
3回答

慕雪6442864

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

森栏

您应该使用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)它们是否适合您的情况!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python