python将lambda函数映射到列表

时间:2016-11-24 03:55:52

标签: python dictionary lambda

我的印象是以下代码模式不好

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函数有助于提高速度吗?

2 个答案:

答案 0 :(得分:9)

首先,lambda只是语法糖,如:

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

lisp启发的函数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)

mapfilterreduce这样的lispy结构可能会被淘汰(转移到functools模块),我建议使用列表推导和生成器新代码中的表达式。

最后,Python在性能方面令人惊讶地违反直觉。您应该始终进行分析,以便对您对绩效的看法进行检查。看到谢尔盖的回答,他证明lambda在这种情况下并不昂贵。

底线:从不担心"优化"一个该死的东西,直到你描述它并确定它是一个顶级瓶颈。

答案 1 :(得分:3)

map调用

时,Lambda只会创建一次
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

如您所见,执行时间不会改变。