Нет.Функциональные объекты, сгенерированные lambda
, ведут себя точно так же, как сгенерированные def
.Они не выполняются быстрее.(Кроме того, inline
в современном C ++ больше не является директивой, указывающей компилятору на встроенную функцию, и имеет мало общего с встраиванием.)
Если хотите, вы можете взглянуть на байт-кодразборка для 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
В этом цикле лямбда на самом деле заняла больше времени.(Похоже, в комментариях есть некоторая путаница относительно того, достаточно ли мы рассчитываем время работы, чтобы иметь смысл. timeit
оборачивает синхронизированный оператор в цикл с миллионами итераций по умолчанию, так что да, так и есть.)
Прежде чем вы спросите, нет, lambda
также не имеет недостатка в производительности по сравнению с def
.Победитель вышеупомянутой гонки в основном зависит от удачи.lambda
и def
имеют существенный недостаток по сравнению с полным отказом от использования функции обратного вызова.Например, map
-с- 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 дорогие для вызова.