【问题标题】:Do Python lambda functions help in reducing the execution times?Python lambda 函数是否有助于减少执行时间?
【发布时间】:2018-12-01 07:58:42
【问题描述】:

据了解,Python lambda functions 有助于创建匿名函数。这些可以用于排序函数中的其他函数,如 map()、reduce()、filter() 和 key()。它也可以用来演示和利用词法闭包。

我想在这里特别了解的是,在执行时间方面,lambda 函数是否比常规函数具有特定优势,考虑到所有其他因素都没有改变

由于我是 Python 新手,我试图通过将它们与 C++ 的内联函数进行类比来理解它们。正如我从 C++ 中理解的那样,内联函数在节省时间方面很有用,因为它们不需要与函数调用和跳转期间发生的上下文切换相关的必要“内务处理任务”。
Python Lambda 函数是否具有与常规函数类似的优势?

我发现一些有用但不一定对我的问题有帮助的相关帖子: Why are Python lambdas useful? Why use lambda functions?

【问题讨论】:

  • 是的,如果你只想从函数中返回一些东西,你应该更喜欢 lambda。
  • 目前,接受user2357112的回答,直到提出更好的解释。谢谢大家!

标签: python lambda


【解决方案1】:

没有。 lambda 生成的函数对象的行为与def 生成的函数对象完全相同。它们的执行速度不会更快。 (另外,现代 C++ 中的inline 不再是告诉编译器内联函数的指令,与内联几乎没有关系。)

如果您愿意,可以查看lambda 和等效def 的字节码反汇编:

import dis

dis.dis(lambda x: x + 2)

print()
def f(x): return x + 2

dis.dis(f)

Output:

  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()))

Output:

0.06977041810750961
0.07760106027126312

在这次运行中,lambda 实际上花费了更长的时间。 (在 cmets 中似乎对我们是否对足够的工作进行了有意义的计时感到困惑。timeit 默认情况下将计时语句包装在 million-iteration loop 中,所以是的,我们是。)

在你问之前,不,lambdadef 相比也没有性能劣势。上述比赛的获胜者基本上取决于运气。不过,lambdadef 确实比完全避免使用回调函数有一个明显的缺点。例如,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)]'))

Output:

1.5655903220176697
0.7803761437535286

无论是lambda 还是def,Python 函数的调用成本都很高。

【讨论】:

  • “map-with-lambda 相对于列表推导具有显着的性能损失”。我们说的还不够
  • @user2357112 感谢您的回复。字节码反汇编和定时输出是有启发性的。我目前的理解是:与 def 函数相比,lambda 并不是特别有利。它们有助于使代码更具可读性(如果并非总是如此,至少有时是这样)。它也是函数式编程选择的遗产 - 谢谢!
  • @Jean-FrançoisFabre:也许吧,虽然只是并排查看两行代码,但我更喜欢列表理解,而不管性能如何。所以一般不用多说!
  • 好吧,让我再说一遍:) list+map+lambda 组合只是为了所谓的专家吹嘘他们对python的理解程度,而列表推导式的存在只是因为它们易于理解.
  • @Jean-FrançoisFabre:同意,特别是我想说list+map+lambda 是为了证明还有其他东西(可能是一种或多种函数式语言)你比你更专业在 Python 中。
猜你喜欢
  • 2020-09-25
  • 2017-10-22
  • 2019-06-03
  • 2012-12-31
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
相关资源
最近更新 更多