Помогают ли функции лямбды Python в сокращении времени выполнения?

Понятно, что лямбда-функции Python помогают создавать анонимные функции. Они могут использоваться в других функциях, таких как map(), Reduce(), Filter() и Key() в функциях сортировки. Он также может быть использован для демонстрации и использования лексических замыканий.

Что я хотел бы здесь конкретно знать, так это то, обладают ли лямбда-функции определенным преимуществом по сравнению с обычными функциями с точки зрения времени их выполнения, учитывая, что все остальные факторы остаются неизменными?

Поскольку я новичок в Python, я попытался понять их, сравнивая их аналогично встроенным функциям C++. Встроенные функции, как я понимаю из C++, полезны для экономии времени, так как они не требуют необходимых "вспомогательных задач", связанных с переключением контекста, которые происходят во время вызовов функций и переходов.
Предоставляют ли функции Python Lambda такие же преимущества по сравнению с обычными функциями?

Некоторые важные посты, которые я нашел полезными, но не обязательно полезными для моего вопроса: Почему полезны лямбды Python? Зачем использовать лямбда-функции?

Ответы

Ответ 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 дорого вызывать.