![](/img/trans.png)
[英]Map function application over a list of functions without lambda in python
[英]python map a lambda function to a list
我的印象是以下代码模式不好
new_data = map(lambda x: f(x, 30), data)
因为lambda函数需要创建len(data)
次,因此效率低下。 在这种情况下,以下解决方法是否有帮助?
g = lambda x: f(x, 30)
new_data = map(g, data)
另外,在给定数据很大的情况下,将替换lambda函数与速度的partial
帮助?
因为lambda函数需要创建len(数据)次,因此效率低下。
事实并非如此,在示例中,lambda定义仅在编译时评估一次而不是len(data)
时间 - 出于性能原因,无需将其分配给名称。 看看谢尔盖的答案,他证明lambda在这种情况下并不昂贵。
如果你想为了清晰起见给它一个名字,你应该只使用def语句。 将lambda分配给名称被认为是错误的样式:根据PEP-8编程建议,您应该“始终使用def语句而不是将lambda表达式直接绑定到标识符的赋值语句”。 引自官方风格指南:
是:
def f(x): return 2*x
没有:
f = lambda x: 2*x:
lambda和单行def
之间的唯一区别是def
会给它一个名字(可能是一个额外的LOAD_CONST):
>>> import dis
>>> def _(x):
return f(x, 30)
>>> dis.dis(_)
2 0 LOAD_GLOBAL 0 (f)
2 LOAD_FAST 0 (x)
4 LOAD_CONST 1 (30)
6 CALL_FUNCTION 2
8 RETURN_VALUE
>>> dis.dis(lambda x: f(x, 30))
1 0 LOAD_GLOBAL 0 (f)
2 LOAD_FAST 0 (x)
4 LOAD_CONST 1 (30)
6 CALL_FUNCTION 2
8 RETURN_VALUE
如上所示,两种表单都编译为相同的字节码。
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
模块),我建议在新代码中使用list comprehensions和generator表达式。
最后,Python在性能方面令人惊讶地违反直觉。 您应该始终进行分析,以便对您对绩效的看法进行检查。
一句话:永远不要担心“优化”该死的东西,直到你对其进行分析并确定它是一个相关的瓶颈。
Lambda只在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
如您所见,执行时间不会改变。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.