blob: 98c1c833ac6f13fb046b46509d18991bcd1d624a [file] [log] [blame]
Skip Montanaroca652742003-04-09 01:38:53 +00001\section{\module{timeit} ---
2 Measure execution time of small code snippets}
3
4\declaremodule{standard}{timeit}
5\modulesynopsis{Measure the execution time of small code snippets.}
6
Fred Drakefcd845a2003-04-09 04:06:37 +00007\versionadded{2.3}
Skip Montanaroca652742003-04-09 01:38:53 +00008\index{Benchmarking}
9\index{Performance}
10
Fred Drakefcd845a2003-04-09 04:06:37 +000011This module provides a simple way to time small bits of Python code.
12It has both command line as well as callable interfaces. It avoids a
13number of common traps for measuring execution times. See also Tim
14Peters' introduction to the ``Algorithms'' chapter in the
15\citetitle{Python Cookbook}, published by O'Reilly.
Skip Montanaroca652742003-04-09 01:38:53 +000016
Fred Drakefcd845a2003-04-09 04:06:37 +000017The module defines the following public class:
Skip Montanaroca652742003-04-09 01:38:53 +000018
Fred Drakefcd845a2003-04-09 04:06:37 +000019\begin{classdesc}{Timer}{\optional{stmt=\code{'pass'}
20 \optional{, setup=\code{'pass'}
21 \optional{, timer=<timer function>}}}}
Skip Montanaroca652742003-04-09 01:38:53 +000022Class for timing execution speed of small code snippets.
23
Fred Drakefcd845a2003-04-09 04:06:37 +000024The constructor takes a statement to be timed, an additional statement
25used for setup, and a timer function. Both statements default to
26\code{'pass'}; the timer function is platform-dependent (see the
27module doc string). The statements may contain newlines, as long as
28they don't contain multi-line string literals.
Skip Montanaroca652742003-04-09 01:38:53 +000029
Fred Drakefcd845a2003-04-09 04:06:37 +000030To measure the execution time of the first statement, use the
31\method{timeit()} method. The \method{repeat()} method is a
32convenience to call \method{timeit()} multiple times and return a list
33of results.
34\end{classdesc}
Skip Montanaroca652742003-04-09 01:38:53 +000035
Fred Drakefcd845a2003-04-09 04:06:37 +000036\begin{methoddesc}{print_exc}{\optional{file=\constant{None}}}
Skip Montanaroca652742003-04-09 01:38:53 +000037Helper to print a traceback from the timed code.
38
39Typical use:
40
41\begin{verbatim}
42 t = Timer(...) # outside the try/except
43 try:
44 t.timeit(...) # or t.repeat(...)
45 except:
46 t.print_exc()
47\end{verbatim}
48
49The advantage over the standard traceback is that source lines in the
50compiled template will be displayed.
Fred Drakefcd845a2003-04-09 04:06:37 +000051The optional \var{file} argument directs where the traceback is sent;
52it defaults to \code{sys.stderr}.
Skip Montanaroca652742003-04-09 01:38:53 +000053\end{methoddesc}
54
Raymond Hettinger52136a82003-05-10 03:35:37 +000055\begin{methoddesc}{repeat}{\optional{repeat\code{=3} \optional{,
Fred Drakefcd845a2003-04-09 04:06:37 +000056 number\code{=1000000}}}}
Skip Montanaroca652742003-04-09 01:38:53 +000057Call \method{timeit()} a few times.
58
Fred Drakefcd845a2003-04-09 04:06:37 +000059This is a convenience function that calls the \method{timeit()}
60repeatedly, returning a list of results. The first argument specifies
61how many times to call \method{timeit()}. The second argument
62specifies the \var{number} argument for \function{timeit()}.
Skip Montanaroca652742003-04-09 01:38:53 +000063
Fred Drakefcd845a2003-04-09 04:06:37 +000064\begin{notice}
65It's tempting to calculate mean and standard deviation from the result
Skip Montanaroca652742003-04-09 01:38:53 +000066vector and report these. However, this is not very useful. In a typical
67case, the lowest value gives a lower bound for how fast your machine can run
68the given code snippet; higher values in the result vector are typically not
69caused by variability in Python's speed, but by other processes interfering
70with your timing accuracy. So the \function{min()} of the result is
71probably the only number you should be interested in. After that, you
72should look at the entire vector and apply common sense rather than
73statistics.
Fred Drakefcd845a2003-04-09 04:06:37 +000074\end{notice}
Skip Montanaroca652742003-04-09 01:38:53 +000075\end{methoddesc}
76
Fred Drakefcd845a2003-04-09 04:06:37 +000077\begin{methoddesc}{timeit}{\optional{number\code{=1000000}}}
78Time \var{number} executions of the main statement.
79This executes the setup statement once, and then
80returns the time it takes to execute the main statement a number of
81times, measured in seconds as a float. The argument is the number of
82times through the loop, defaulting to one million. The main
83statement, the setup statement and the timer function to be used are
84passed to the constructor.
Skip Montanaroca652742003-04-09 01:38:53 +000085\end{methoddesc}
Fred Drakefcd845a2003-04-09 04:06:37 +000086
Skip Montanaroca652742003-04-09 01:38:53 +000087
88\subsection{Command Line Interface}
89
90When called as a program from the command line, the following form is used:
91
92\begin{verbatim}
Fred Drakefcd845a2003-04-09 04:06:37 +000093python timeit.py [-n N] [-r N] [-s S] [-t] [-c] [-h] [statement ...]
Skip Montanaroca652742003-04-09 01:38:53 +000094\end{verbatim}
95
96where the following options are understood:
97
98\begin{description}
Raymond Hettinger9d12ab52003-08-31 04:20:12 +000099\item[-n N/\longprogramopt{number=N}] how many times to execute 'statement'
100\item[-r N/\longprogramopt{repeat=N}] how many times to repeat the timer (default 3)
101\item[-s S/\longprogramopt{setup=S}] statement to be executed once initially (default
Fred Drakefcd845a2003-04-09 04:06:37 +0000102\code{'pass'})
Raymond Hettinger9d12ab52003-08-31 04:20:12 +0000103\item[-t/\longprogramopt{time}] use \function{time.time()}
Fred Drakefcd845a2003-04-09 04:06:37 +0000104(default on all platforms but Windows)
Raymond Hettinger9d12ab52003-08-31 04:20:12 +0000105\item[-c/\longprogramopt{clock}] use \function{time.clock()} (default on Windows)
106\item[-v/\longprogramopt{verbose}] print raw timing results; repeat for more digits
Fred Drakefcd845a2003-04-09 04:06:37 +0000107precision
Raymond Hettinger9d12ab52003-08-31 04:20:12 +0000108\item[-h/\longprogramopt{help}] print a short usage message and exit
Skip Montanaroca652742003-04-09 01:38:53 +0000109\end{description}
110
Fred Drakefcd845a2003-04-09 04:06:37 +0000111A multi-line statement may be given by specifying each line as a
112separate statement argument; indented lines are possible by enclosing
113an argument in quotes and using leading spaces. Multiple
114\programopt{-s} options are treated similarly.
Skip Montanaroca652742003-04-09 01:38:53 +0000115
Fred Drakefcd845a2003-04-09 04:06:37 +0000116If \programopt{-n} is not given, a suitable number of loops is
117calculated by trying successive powers of 10 until the total time is
118at least 0.2 seconds.
Skip Montanaroca652742003-04-09 01:38:53 +0000119
Fred Drakefcd845a2003-04-09 04:06:37 +0000120The default timer function is platform dependent. On Windows,
121\function{time.clock()} has microsecond granularity but
122\function{time.time()}'s granularity is 1/60th of a second; on \UNIX,
123\function{time.clock()} has 1/100th of a second granularity and
124\function{time.time()} is much more precise. On either platform, the
Martin v. Löwis7bdc4842003-09-20 11:09:28 +0000125default timer functions measure wall clock time, not the CPU time.
Fred Drakefcd845a2003-04-09 04:06:37 +0000126This means that other processes running on the same computer may
127interfere with the timing. The best thing to do when accurate timing
128is necessary is to repeat the timing a few times and use the best
129time. The \programopt{-r} option is good for this; the default of 3
130repetitions is probably enough in most cases. On \UNIX, you can use
131\function{time.clock()} to measure CPU time.
Skip Montanaroca652742003-04-09 01:38:53 +0000132
Fred Drakefcd845a2003-04-09 04:06:37 +0000133\begin{notice}
134 There is a certain baseline overhead associated with executing a
135 pass statement. The code here doesn't try to hide it, but you
136 should be aware of it. The baseline overhead can be measured by
137 invoking the program without arguments.
138\end{notice}
Skip Montanaroca652742003-04-09 01:38:53 +0000139
Fred Drakefcd845a2003-04-09 04:06:37 +0000140The baseline overhead differs between Python versions! Also, to
141fairly compare older Python versions to Python 2.3, you may want to
142use Python's \programopt{-O} option for the older versions to avoid
143timing \code{SET_LINENO} instructions.
Skip Montanaroca652742003-04-09 01:38:53 +0000144
145\subsection{Examples}
146
Fred Drakefcd845a2003-04-09 04:06:37 +0000147Here are two example sessions (one using the command line, one using
148the module interface) that compare the cost of using
149\function{hasattr()} vs. \keyword{try}/\keyword{except} to test for
150missing and present object attributes.
Skip Montanaroca652742003-04-09 01:38:53 +0000151
152\begin{verbatim}
Fred Drakefcd845a2003-04-09 04:06:37 +0000153% timeit.py 'try:' ' str.__nonzero__' 'except AttributeError:' ' pass'
Skip Montanaroca652742003-04-09 01:38:53 +0000154100000 loops, best of 3: 15.7 usec per loop
Fred Drakefcd845a2003-04-09 04:06:37 +0000155% timeit.py 'if hasattr(str, "__nonzero__"): pass'
Skip Montanaroca652742003-04-09 01:38:53 +0000156100000 loops, best of 3: 4.26 usec per loop
Fred Drakefcd845a2003-04-09 04:06:37 +0000157% timeit.py 'try:' ' int.__nonzero__' 'except AttributeError:' ' pass'
Skip Montanaroca652742003-04-09 01:38:53 +00001581000000 loops, best of 3: 1.43 usec per loop
Fred Drakefcd845a2003-04-09 04:06:37 +0000159% timeit.py 'if hasattr(int, "__nonzero__"): pass'
Skip Montanaroca652742003-04-09 01:38:53 +0000160100000 loops, best of 3: 2.23 usec per loop
161\end{verbatim}
162
163\begin{verbatim}
164>>> import timeit
165>>> s = """\
166... try:
Fred Drakefcd845a2003-04-09 04:06:37 +0000167... str.__nonzero__
Skip Montanaroca652742003-04-09 01:38:53 +0000168... except AttributeError:
Fred Drakefcd845a2003-04-09 04:06:37 +0000169... pass
Skip Montanaroca652742003-04-09 01:38:53 +0000170... """
171>>> t = timeit.Timer(stmt=s)
172>>> print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)
17317.09 usec/pass
174>>> s = """\
175... if hasattr(str, '__nonzero__'): pass
176... """
177>>> t = timeit.Timer(stmt=s)
178>>> print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)
1794.85 usec/pass
180>>> s = """\
181... try:
Fred Drakefcd845a2003-04-09 04:06:37 +0000182... int.__nonzero__
Skip Montanaroca652742003-04-09 01:38:53 +0000183... except AttributeError:
Fred Drakefcd845a2003-04-09 04:06:37 +0000184... pass
Skip Montanaroca652742003-04-09 01:38:53 +0000185... """
186>>> t = timeit.Timer(stmt=s)
187>>> print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)
1881.97 usec/pass
189>>> s = """\
190... if hasattr(int, '__nonzero__'): pass
191... """
192>>> t = timeit.Timer(stmt=s)
193>>> print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)
1943.15 usec/pass
195\end{verbatim}
Skip Montanaroa30dffb2003-05-09 18:21:02 +0000196
197To give the \module{timeit} module access to functions you
198define, you can pass a \code{setup} parameter which contains an import
199statement:
200
201\begin{verbatim}
202def test():
203 "Stupid test function"
204 L = []
205 for i in range(100):
206 L.append(i)
207
208if __name__=='__main__':
209 from timeit import Timer
210 t = Timer("test()", "from __main__ import test")
211 print t.timeit()
212\end{verbatim}