2016-11-24 68 views
2

我的印象中,因爲lambda函數需要創建len(data)倍,因此效率低下下面的代碼模式是不好的蟒蛇lambda函數映射到一個列表

new_data = map(lambda x: f(x, 30), data) 

。在這種情況下,下面的解決方法是否有幫助?

g = lambda x: f(x, 30) 
new_data = map(g, data) 

此外,將與partial幫助的速度更換lambda函數,給出的數據是大嗎?

+0

兩者都是相同的東西AFAIK。 –

回答

3

首先,拉姆達僅僅是類似的語法糖:

def function(x): 
    return f(x, 30) 

口齒不清的啓發功能mapfilterreduce總是在Python覺得有點陌生。自引入列表解析(2.0版IINM)以來,它們成爲實現相同結果的慣用方式。所以這樣的:

new_data = map(lambda x: f(x, 30), data) 

常被寫成:

new_data = [f(x, 30) for x in data] 

如果數據是大,你只是遍歷它,發電機表達式貿易內存CPU:

for value in (f(x, 30) for x in data): 
    do_something_with(value) 

的lispy像map,filterreduce這樣的結構很可能會退役(移到functools模塊),我推薦使用列表解析和新代碼中的生成器表達式。最後,關於性能,Python令人驚訝地違反直覺。你應該始終配置文件,以便對你的表現進行檢查。看到謝爾蓋的回答,他證明拉姆達在這種情況下並不昂貴。

底線:從不擔心「優化」一件該死的東西,直到您對它進行了配置並確定它是一個頂級瓶頸。

3

拉姆達創建只有一次,當map調用

In [20]: l = list(range(100000)) 

In [21]: %timeit list(map(lambda x: x * 2, l)) 
100 loops, best of 3: 13.8 ms per loop 

In [22]: g = lambda x: x * 2 

In [23]: %timeit list(map(g, l)) 
100 loops, best of 3: 13.8 ms per loop 

正如你所看到的,執行時間沒有改變。