蟒蛇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。 –