蟒蛇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函数,给出的数据是大吗?

+0

两者都是相同的东西AFAIK。 –

首先,拉姆达仅仅是类似的语法糖:

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令人惊讶地违反直觉。你应该始终配置文件,以便对你的表现进行检查。看到谢尔盖的回答,他证明拉姆达在这种情况下并不昂贵。

底线:从不担心“优化”一件该死的东西,直到您对它进行了配置并确定它是一个顶级瓶颈。

拉姆达创建只有一次,当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 

正如你所看到的,执行时间没有改变。