2013-05-15 32 views
0

map(lambda x: len(x), aLotOfData)將拉姆達FUNC被「緩存」 /想起

我寫一些代碼與上述類似,它實際上是比較慢,如果我把在lambda DEF在同一行?或者我應該分配給變量f,以避免在每次迭代中演化lambda def或者實際上足夠聰明的python來緩存它?

+0

thansk bakuriu,我的例子是種過度簡化。 lambda不僅僅是len()。正在考慮是否有任何使用lambda的重大傷害,因爲有時它具有更好的可讀性 – John

回答

1

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')?

+0

謝謝,但爲什麼'地圖與lambda緩慢'如果lambda只評估一次?我認爲map只是和一個額外的func完全一樣,就像[len(x)for aLotOfData]一樣?我可以想象它會更慢(因爲它有更多的堆棧操作),但它可能不會很慢?或者我錯過了一些非常基礎的東西?謝謝 – John

+0

@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