Il est entendu que Python lambda fonctions aident à créer des fonctions anonymes. Ceux-ci peuvent être utilisés dans d'autres fonctions comme map (), réduire (), filtre () et clé () dans les fonctions de tri. Il peut également être utilisé pour démontrer et utiliser des fermetures lexicales.
Ce que je voudrais savoir spécifiquement ici, c'est que les fonctions lambda ont un avantage spécifique sur les fonctions régulières en termes de temps d'exécution, considérant tous les autres facteurs comme inchangés ?
Comme je suis nouveau sur Python, j'ai essayé de les comprendre en les comparant de manière analogue avec les fonctions en ligne de C++. Les fonctions en ligne, si je comprends bien de C++, sont utiles pour gagner du temps car elles ne nécessitent pas les "tâches de maintenance" nécessaires concernant le changement de contexte qui se produisent pendant les appels de fonction et les sauts.
Les fonctions Python Lambda offrent-elles des avantages similaires par rapport aux fonctions normales?
Quelques articles pertinents que j'ai trouvé utiles mais pas nécessairement utiles pour ma question: Pourquoi les Python lambdas sont-ils utiles?Pourquoi utiliser les fonctions lambda?
Non. Les objets fonction générés par lambda
se comportent exactement comme ceux générés par def
. Ils ne s'exécutent pas plus rapidement. (De plus, inline
en C++ moderne n'est plus une directive indiquant au compilateur d'inline une fonction, et a très peu à voir avec l'inline.)
Si vous le souhaitez, vous pouvez jeter un œil au démontage du bytecode pour un lambda
et un équivalent def
:
import dis
dis.dis(lambda x: x + 2)
print()
def f(x): return x + 2
dis.dis(f)
Sortie :
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
Aucune différence. Vous pouvez également les chronométrer:
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()))
Sortie :
0.06977041810750961
0.07760106027126312
La lambda a en fait pris plus de temps dans cette course. (Il semble y avoir une certaine confusion dans les commentaires sur le fait de savoir si nous prévoyons suffisamment de travail pour être significatif. timeit
encapsule l'instruction chronométrée dans une boucle d'itération de millions par défaut, alors oui , nous sommes.)
Avant de demander, non, lambda
n'a pas non plus d'inconvénient sur les performances par rapport à def
. Le vainqueur de la course ci-dessus dépend de la chance. lambda
et def
présentent cependant un inconvénient important par rapport à l’évitement de l’utilisation d’une fonction de rappel. Par exemple, map
- avec - lambda
a une pénalité de performance importante par rapport aux compréhensions de liste:
import timeit
print(timeit.timeit('list(map(lambda x: x*x, range(10)))'))
print(timeit.timeit('[x*x for x in range(10)]'))
Sortie :
1.5655903220176697
0.7803761437535286
Que lambda
ou def
, Python coûtent cher à appeler.