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不在同一范圍內。
只是在我將內部塊移動到代碼的不同部分后才出現問題(讀?。壕S護期間出現問題,而不是開發),我沒想到。
是的,如果你從未犯過這個錯誤,那么列表理解就更優雅了。
但是從個人經驗(以及看到其他人犯同樣的錯誤)我已經看到它發生了足夠多次,我認為當這些錯誤蔓延到你的代碼中時,你不得不經歷這種痛苦。
結論:
使用map和filter。它們可以防止難以診斷的與范圍相關的細微錯誤。
邊注:
不要忘記考慮使用imap和ifilter(in itertools)它們是否適合您的情況!
添加回答
舉報
0/150
提交
取消
