Le module timeit permet de déterminer le temps d'exécution de courts programmes Python. Il utilise une fonction temps spécifique à la plateforme considérée.
Le coût dû au démarrage ou à l'arrêt du programme est enlevé, en exécutant ce dernier plusieurs fois.
Il n'y a qu'une classe publique dans le module timeit, à savoir Timer. Le constructeur de cette dernière reçoit une expression (chaîne de caractères) à chronométrer, et une expression de configuration (pour initialiser les variables, par exemple).
Ces deux arguments sont des chaînes de caractères.
Considérons le bout de code suivant...
>>> import timeit >>> t = timeit.Timer("print 'exécution principale'", ... "print 'configuration'")
La méthode timeit() :
On peut spécifier un autre nombre d'exécutions en argument de timeit, ce qui donne...
>>> import timeit >>> t = timeit.Timer("print 'exécution principale'", ... "print 'configuration'") >>> print t.timeit(3) configuration exécution principale exécution principale exécution principale 0.000208854675293
On peut encore répéter cela plusieurs fois, avec la méthode repeat et récupérer la liste des temps d'exécution :
>>> print t.repeat(2, 3) configuration exécution principale exécution principale exécution principale configuration exécution principale exécution principale exécution principale [0.00019812583923339844, 0.00019383430480957031, 0.00019383430480957031]
On souhaite calculer le temps nécessaire à obtenir $n$ termes de la suite de Fibonacci, en utilisant la relation de base $\left\{ \begin{array}{l} u_0 = u_1 = 1\\ u_{n+2} = u_n + u_{n+1} \end{array} \right.$
On peut procéder ainsi :
>>> import timeit >>> t = timeit.Timer(''' ... c=a+b ... a=b ... b=c ... print c''','a,b=1,1') >>> t.timeit(10) 2 3 5 8 13 21 34 55 89 144 0.00011301040649414062
Dans le constructeur Timer, on a fourni la relation de récurrence, ainsi que les termes initiaux de la suite en second argument. On retrouve bien les termes de la suite, suivi du temps total.
Si vous avez créé un programme toto.py, dont vous voulez calculer le temps d'exécution, alors lancez python, et procédez ainsi :
>>> import timeit >>> t=timeit.Timer('import toto','') >>> t.timeit()
Si vous souhaitez tester une fonction, mettez-là dans un fichier .py, et procédez comme ci-dessus.
timeit fournit aussi une interface en ligne de commande, directement accessible à partir du shell (sans lancer python en mode interactif, donc, ni exécuter un code .py).
Pour se faire, on utilise la commande suivante, qui traite le module passé en argument comme un programme principal :
$ python -m timeit
Par exemple, pour obtenir de l'aide :
$ python -m timeit -h
Le fonctionnement est ici un peu différent de ce qui précède. Par exemple,
$ python -m timeit -s "d={}" "for i in range(1000):" " d[str(i)] = i" 10 loops, best of 3: 16.7 msec per loop
correspond au code python :
>>> d = {} >>> for i in range(1000): ... d[str(i)] = i ...
On s'aperçoit que :