map(lambda x: len(x), aLotOfData)
將拉姆達FUNC被「緩存」 /想起
我寫一些代碼與上述類似,它實際上是比較慢,如果我把在lambda DEF在同一行?或者我應該分配給變量f,以避免在每次迭代中演化lambda def或者實際上足夠聰明的python來緩存它?
map(lambda x: len(x), aLotOfData)
將拉姆達FUNC被「緩存」 /想起
我寫一些代碼與上述類似,它實際上是比較慢,如果我把在lambda DEF在同一行?或者我應該分配給變量f,以避免在每次迭代中演化lambda def或者實際上足夠聰明的python來緩存它?
lambda
僅被評估一次(轉換爲代碼對象),因此不需要將其分配給變量。
>>> import dis
>>> def func():
... map(lambda x: len(x), aLotOfData)
...
>>> dis.dis(func)
2 0 LOAD_GLOBAL 0 (map)
3 LOAD_CONST 1 (<code object <lambda> at 0x31c3d30, file "<ipython-input-30-27b0b12b0965>", line 2>)
6 MAKE_FUNCTION 0
9 LOAD_GLOBAL 1 (aLotOfData)
12 CALL_FUNCTION 2
15 POP_TOP
16 LOAD_CONST 0 (None)
19 RETURN_VALUE
但作爲map
是拉姆達的所以應該用一個列表理解或發電機表達式(如果你想要一個迭代器),在這裏慢。
[len(x) for x in aLotOfData]
或定義一個完整的功能,這是更可讀:
def my_func(x):
#do something with x
return something
[my_func(x) for x in aLotOfData]
Which is more preferable to use in Python: lambda functions or nested functions ('def')?
謝謝,但爲什麼'地圖與lambda緩慢'如果lambda只評估一次?我認爲map只是和一個額外的func完全一樣,就像[len(x)for aLotOfData]一樣?我可以想象它會更慢(因爲它有更多的堆棧操作),但它可能不會很慢?或者我錯過了一些非常基礎的東西?謝謝 – John
@JohnZ答案有點誤導。由於'lambda','[f(x)for x in l]'只比'map(lambda x:f(x),l)'快,但這是一個愚蠢的比較。 map(map,map)總是比給出相同表達式的列表理解更快,所以'map(f,l)'比'[f(x)for x in l]'更快,map [lambda x:f(x) ,l)'比l []中的[[(lambda x:f(x))(x)更快。 – Aya
thansk bakuriu,我的例子是種過度簡化。 lambda不僅僅是len()。正在考慮是否有任何使用lambda的重大傷害,因爲有時它具有更好的可讀性 – John