4 votes

Pourquoi le temps d'exécution d'une fonction lambda est-il différent selon qu'elle est transmise en tant qu'appelable ou en tant que chaîne de caractères à timeit.repeat() ?

J'ai obtenu des résultats différents avec les deux lignes python timeit suivantes.

print(min(timeit.repeat(lambda: 1+1)))
print(min(timeit.repeat('lambda: 1+1')))

Le résultat ressemble à quelque chose comme :

0.13658121100002063
0.10372773000017332

Pourriez-vous nous expliquer la différence entre les deux ?

9voto

moooeeeep Points 10167

À première vue, il s'agit d'une question très intéressante !

Mais d'abord, jetez un coup d'œil sur les docs :

Les stmt y configuration peuvent également prendre des objets qui peuvent être appelés sans arguments. Cela permet d'intégrer les appels à ces objets dans une fonction de temporisation qui sera ensuite exécutée par la fonction timeit() . Notez que la surcharge temporelle est un peu plus importante dans ce cas en raison des appels de fonction supplémentaires.

Lorsque vous parvenez à ne pas tomber dans le piège consistant à attribuer la différence observée à la surcharge des appels de fonction, vous remarquez que le premier argument est soit un appelable qui est appelé ou un déclaration qui est exécutée.

Ainsi, dans vos deux lignes de code, vous mesurez la performance de deux choses différentes.

Dans la première ligne, vous passez un objet appelable qui est appelé et dont le temps d'exécution est mesuré :

timeit.repeat(lambda: 1+1)

Ici, vous passez une instruction en cours d'exécution et son temps d'exécution est mesuré :

timeit.repeat('lambda: 1+1')

Notez que dans le second cas, vous n'appelez pas réellement la fonction, mais mesurez le temps nécessaire à la création de la lambda !

Si vous vouliez à nouveau mesurer le temps d'exécution de l'appel de fonction, vous auriez dû écrire quelque chose comme ceci :

timeit.repeat('test()', 'test=lambda: 1+1')

À titre de comparaison, voici un exemple :

import time
print(min(timeit.repeat(lambda: time.sleep(1), number=1))) 
print(min(timeit.repeat('lambda: time.sleep(1)', number=1))) 

Le résultat montre clairement la différence (le premier appelle la fonction, le second crée la fonction) :

1.0009081270000024
5.370002327254042e-07

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X