据了解,Python lambda 函数有助于创建匿名函数.这些可以在排序函数中的map(),reduce(),filter()和key()等其他函数中使用.它还可以用于演示和利用词法闭包.
我想在这里特别了解的是,lambda函数在执行时间方面是否比常规函数具有特定优势,考虑到所有其他因素不变?
由于我是Python的新手,我试图通过类似地将它们与C++的内联函数进行比较来理解它们.正如我从C++中理解的那样,内联函数在节省时间方面很有用,因为它们不需要与函数调用和跳转期间发生的上下文切换有关的必要"内务处理任务".
Python Lambda函数与常规函数相比具有类似的优势吗?
我发现一些相关帖子对我的问题有用但不一定有用: 为什么Python lambdas有用? 为什么要使用lambda函数?
use*_*ica 39
不行.所生成的函数对象的lambda行为与生成的函数对象完全相同def.它们执行速度不快.(另外,inline在现代C++中,不再是告诉编译器内联函数的指令,并且与内联几乎没有关系.)
如果需要,可以查看a lambda和等效的字节码反汇编def:
import dis
dis.dis(lambda x: x + 2)
print()
def f(x): return x + 2
dis.dis(f)
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
没有不同.你也可以计时:
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()))
Run Code Online (Sandbox Code Playgroud)
输出:
0.06977041810750961
0.07760106027126312
Run Code Online (Sandbox Code Playgroud)
lambda实际上在这次运行中需要更长的时间.(评论中似乎有一些混淆,关于我们是否有足够的工作时间才能有意义.默认情况下timeit将定时语句包含在百万次迭代循环中,所以是的,我们是.)
在你提出要求之前,没有,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)]'))
Run Code Online (Sandbox Code Playgroud)
输出:
1.5655903220176697
0.7803761437535286
Run Code Online (Sandbox Code Playgroud)
无论是lambda或def,Python的功能是拨打昂贵.
| 归档时间: |
|
| 查看次数: |
1509 次 |
| 最近记录: |