我的印象中,因爲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函數,給出的數據是大嗎?
我的印象中,因爲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函數,給出的數據是大嗎?
首先,拉姆達僅僅是類似的語法糖:
def function(x):
return f(x, 30)
口齒不清的啓發功能map
,filter
和reduce
總是在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
,filter
和reduce
這樣的結構很可能會退役(移到functools
模塊),我推薦使用列表解析和新代碼中的生成器表達式。最後,關於性能,Python令人驚訝地違反直覺。你應該始終配置文件,以便對你的表現進行檢查。看到謝爾蓋的回答,他證明拉姆達在這種情況下並不昂貴。
底線:從不擔心「優化」一件該死的東西,直到您對它進行了配置並確定它是一個頂級瓶頸。
拉姆達創建只有一次,當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
正如你所看到的,執行時間沒有改變。
兩者都是相同的東西AFAIK。 –