我的印象是以下代码模式不好
new_data = map(lambda x: f(x, 30), data)
因为lambda函数需要创建len(data)
次,因此效率低下。在这种情况下,以下解决方法会有帮助吗?
g = lambda x: f(x, 30)
new_data = map(g, data)
另外,在给定数据很大的情况下,用partial
替换lambda函数有助于提高速度吗?
答案 0 :(得分:9)
首先,lambda只是语法糖,如:
def function(x):
return f(x, 30)
lisp启发的函数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)
像map
,filter
和reduce
这样的lispy结构可能会被淘汰(转移到functools
模块),我建议使用列表推导和生成器新代码中的表达式。
最后,Python在性能方面令人惊讶地违反直觉。您应该始终进行分析,以便对您对绩效的看法进行检查。看到谢尔盖的回答,他证明lambda在这种情况下并不昂贵。
底线:从不担心"优化"一个该死的东西,直到你描述它并确定它是一个顶级瓶颈。
答案 1 :(得分: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
如您所见,执行时间不会改变。