web-dev-qa-db-fra.com

Les fonctions Python lambda aident-elles à réduire les temps d'exécution?

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?

28
bp14

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.

39
user2357112