亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

列表理解與地圖

列表理解與地圖

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不在同一范圍內。
只是在我內部塊移動到代碼的不同部分后才出現問題(讀?。壕S護期間出現問題,而不是開發),我沒想到。

是的,如果你從未犯過這個錯誤,那么列表理解就更優雅了。
但是從個人經驗(以及看到其他人犯同樣的錯誤)我已經看到它發生了足夠多次,我認為當這些錯誤蔓延到你的代碼中時,你不得不經歷這種痛苦。

結論:

使用mapfilter。它們可以防止難以診斷的與范圍相關的細微錯誤。

邊注:

不要忘記考慮使用imapifilter(in itertools)它們是否適合您的情況!


查看完整回答
反對 回復 2019-05-28
  • 3 回答
  • 0 關注
  • 474 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號