Ответ 1
Нет. Объекты функций, сгенерированные 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
-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 дорого вызывать.