可以理解, Python lambda functions 可帮助创建匿名函数。这些可以在排序函数中的其他函数中使用,例如map(),reduce(),filter()和key()。它也可以用来演示和利用词汇闭包。
我想在这里具体了解的是,lambda函数在执行时间方面是否比常规函数具有特定优势,并且考虑所有其他因素不变?
由于我是Python的新手,所以我试图通过将它们与C ++的内联函数进行类似的比较来理解它们。从C ++可以理解,内联函数可以节省时间,因为它们不需要与在函数调用和跳转过程中发生的上下文切换有关的必要“内务处理”。
与常规函数相比,Python Lambda函数是否具有类似的优势?
一些相关的帖子对我的问题有用但不一定有用: Why are Python lambdas useful? Why use lambda functions?
答案 0 :(得分:39)
不。 lambda
生成的功能对象的行为与def
生成的功能对象完全相同。它们不会更快地执行。 (此外,现代C ++中的inline
不再是告诉编译器内联函数的指令,与内联无关。)
如果需要,可以查看lambda
和等效的def
的字节码反汇编:
import dis
dis.dis(lambda x: x + 2)
print()
def f(x): return x + 2
dis.dis(f)
3 0 LOAD_FAST 0 (x)
3 LOAD_CONST 1 (2)
6 BINARY_ADD
7 RETURN_VALUE
6 0 LOAD_FAST 0 (x)
3 LOAD_CONST 1 (2)
6 BINARY_ADD
7 RETURN_VALUE
没有区别。您还可以为它们计时:
import timeit
def f(x): return x + 2
g = lambda x: x + 2
print(timeit.timeit('f(3)', globals=globals()))
print(timeit.timeit('g(3)', globals=globals()))
0.06977041810750961
0.07760106027126312
lambda实际上在此运行中花费了更长的时间。 (关于我们是否安排足够的时间来有意义的工作,评论中似乎有些困惑。timeit
默认将定时语句包装在million-iteration loop中,所以是的。)>
在您询问之前,lambda
也不比def
在性能上有劣势。以上比赛的获胜者基本上要靠运气。不过,lambda
和def
与完全避免使用回调函数相比,确实具有明显的劣势。例如,map
-with-lambda
相对于列表理解有明显的性能损失:
import timeit
print(timeit.timeit('list(map(lambda x: x*x, range(10)))'))
print(timeit.timeit('[x*x for x in range(10)]'))
1.5655903220176697
0.7803761437535286
无论是lambda
还是def
,Python函数的调用成本都很高。