| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | :mod:`timeit` --- Measure execution time of small code snippets
 | 
					
						
							|  |  |  | ===============================================================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. module:: timeit
 | 
					
						
							|  |  |  |    :synopsis: Measure the execution time of small code snippets.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-11 15:02:54 -04:00
										 |  |  | **Source code:** :source:`Lib/timeit.py`
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. index::
 | 
					
						
							|  |  |  |    single: Benchmarking
 | 
					
						
							|  |  |  |    single: Performance
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-27 01:20:32 +00:00
										 |  |  | --------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | This module provides a simple way to time small bits of Python code. It has both
 | 
					
						
							| 
									
										
										
										
											2016-04-16 04:59:38 +00:00
										 |  |  | a :ref:`timeit-command-line-interface` as well as a :ref:`callable <python-interface>`
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  | one.  It avoids a number of common traps for measuring execution times.
 | 
					
						
							|  |  |  | See also Tim Peters' introduction to the "Algorithms" chapter in the *Python
 | 
					
						
							|  |  |  | Cookbook*, published by O'Reilly.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  | Basic Examples
 | 
					
						
							|  |  |  | --------------
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-16 04:59:38 +00:00
										 |  |  | The following example shows how the :ref:`timeit-command-line-interface`
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  | can be used to compare three different expressions:
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-08 19:18:04 +03:00
										 |  |  | .. code-block:: shell-session
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-04 17:01:16 +03:00
										 |  |  |    $ python3 -m timeit '"-".join(str(n) for n in range(100))'
 | 
					
						
							| 
									
										
										
										
											2016-10-23 15:17:05 +03:00
										 |  |  |    10000 loops, best of 5: 30.2 usec per loop
 | 
					
						
							| 
									
										
										
										
											2014-08-04 17:01:16 +03:00
										 |  |  |    $ python3 -m timeit '"-".join([str(n) for n in range(100)])'
 | 
					
						
							| 
									
										
										
										
											2016-10-23 15:17:05 +03:00
										 |  |  |    10000 loops, best of 5: 27.5 usec per loop
 | 
					
						
							| 
									
										
										
										
											2014-08-04 17:01:16 +03:00
										 |  |  |    $ python3 -m timeit '"-".join(map(str, range(100)))'
 | 
					
						
							| 
									
										
										
										
											2016-10-23 15:17:05 +03:00
										 |  |  |    10000 loops, best of 5: 23.2 usec per loop
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  | This can be achieved from the :ref:`python-interface` with::
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |    >>> import timeit
 | 
					
						
							|  |  |  |    >>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
 | 
					
						
							| 
									
										
										
										
											2014-08-04 17:01:16 +03:00
										 |  |  |    0.3018611848820001
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |    >>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000)
 | 
					
						
							| 
									
										
										
										
											2014-08-04 17:01:16 +03:00
										 |  |  |    0.2727368790656328
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |    >>> timeit.timeit('"-".join(map(str, range(100)))', number=10000)
 | 
					
						
							| 
									
										
										
										
											2014-08-04 17:01:16 +03:00
										 |  |  |    0.23702679807320237
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | Note however that :mod:`timeit` will automatically determine the number of
 | 
					
						
							|  |  |  | repetitions only when the command-line interface is used.  In the
 | 
					
						
							|  |  |  | :ref:`timeit-examples` section you can find more advanced examples.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  | .. _python-interface:
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  | Python Interface
 | 
					
						
							|  |  |  | ----------------
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  | The module defines three convenience functions and a public class:
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-22 23:13:50 -04:00
										 |  |  | .. function:: timeit(stmt='pass', setup='pass', timer=<default timer>, number=1000000, globals=None)
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |    Create a :class:`Timer` instance with the given statement, *setup* code and
 | 
					
						
							|  |  |  |    *timer* function and run its :meth:`.timeit` method with *number* executions.
 | 
					
						
							| 
									
										
										
										
											2014-08-22 23:13:50 -04:00
										 |  |  |    The optional *globals* argument specifies a namespace in which to execute the
 | 
					
						
							|  |  |  |    code.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionchanged:: 3.5
 | 
					
						
							|  |  |  |       The optional *globals* parameter was added.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-06 17:55:18 +02:00
										 |  |  | .. function:: repeat(stmt='pass', setup='pass', timer=<default timer>, repeat=5, number=1000000, globals=None)
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |    Create a :class:`Timer` instance with the given statement, *setup* code and
 | 
					
						
							|  |  |  |    *timer* function and run its :meth:`.repeat` method with the given *repeat*
 | 
					
						
							| 
									
										
										
										
											2014-08-22 23:13:50 -04:00
										 |  |  |    count and *number* executions.  The optional *globals* argument specifies a
 | 
					
						
							|  |  |  |    namespace in which to execute the code.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-22 23:13:50 -04:00
										 |  |  |    .. versionchanged:: 3.5
 | 
					
						
							|  |  |  |       The optional *globals* parameter was added.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-06 17:55:18 +02:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							|  |  |  |       Default value of *repeat* changed from 3 to 5.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  | .. function:: default_timer()
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 06:01:16 +03:00
										 |  |  |    The default timer, which is always :func:`time.perf_counter`.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 06:01:16 +03:00
										 |  |  |    .. versionchanged:: 3.3
 | 
					
						
							|  |  |  |       :func:`time.perf_counter` is now the default timer.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-22 23:13:50 -04:00
										 |  |  | .. class:: Timer(stmt='pass', setup='pass', timer=<timer function>, globals=None)
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |    Class for timing execution speed of small code snippets.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |    The constructor takes a statement to be timed, an additional statement used
 | 
					
						
							|  |  |  |    for setup, and a timer function.  Both statements default to ``'pass'``;
 | 
					
						
							|  |  |  |    the timer function is platform-dependent (see the module doc string).
 | 
					
						
							|  |  |  |    *stmt* and *setup* may also contain multiple statements separated by ``;``
 | 
					
						
							| 
									
										
										
										
											2014-08-22 23:13:50 -04:00
										 |  |  |    or newlines, as long as they don't contain multi-line string literals.  The
 | 
					
						
							|  |  |  |    statement will by default be executed within timeit's namespace; this behavior
 | 
					
						
							|  |  |  |    can be controlled by passing a namespace to *globals*.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |    To measure the execution time of the first statement, use the :meth:`.timeit`
 | 
					
						
							| 
									
										
										
										
											2016-08-15 01:27:03 +10:00
										 |  |  |    method.  The :meth:`.repeat` and :meth:`.autorange` methods are convenience
 | 
					
						
							|  |  |  |    methods to call :meth:`.timeit` multiple times.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-21 19:43:33 -04:00
										 |  |  |    The execution time of *setup* is excluded from the overall timed execution run.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |    The *stmt* and *setup* parameters can also take objects that are callable
 | 
					
						
							|  |  |  |    without arguments.  This will embed calls to them in a timer function that
 | 
					
						
							|  |  |  |    will then be executed by :meth:`.timeit`.  Note that the timing overhead is a
 | 
					
						
							|  |  |  |    little larger in this case because of the extra function calls.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-22 23:13:50 -04:00
										 |  |  |    .. versionchanged:: 3.5
 | 
					
						
							|  |  |  |       The optional *globals* parameter was added.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |    .. method:: Timer.timeit(number=1000000)
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |       Time *number* executions of the main statement.  This executes the setup
 | 
					
						
							|  |  |  |       statement once, and then returns the time it takes to execute the main
 | 
					
						
							|  |  |  |       statement a number of times, measured in seconds as a float.
 | 
					
						
							|  |  |  |       The argument is the number of times through the loop, defaulting to one
 | 
					
						
							|  |  |  |       million.  The main statement, the setup statement and the timer function
 | 
					
						
							|  |  |  |       to be used are passed to the constructor.
 | 
					
						
							| 
									
										
										
										
											2012-04-24 18:11:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |       .. note::
 | 
					
						
							| 
									
										
										
										
											2012-04-24 18:11:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |          By default, :meth:`.timeit` temporarily turns off :term:`garbage
 | 
					
						
							|  |  |  |          collection` during the timing.  The advantage of this approach is that
 | 
					
						
							|  |  |  |          it makes independent timings more comparable.  This disadvantage is
 | 
					
						
							|  |  |  |          that GC may be an important component of the performance of the
 | 
					
						
							|  |  |  |          function being measured.  If so, GC can be re-enabled as the first
 | 
					
						
							|  |  |  |          statement in the *setup* string.  For example::
 | 
					
						
							| 
									
										
										
										
											2012-04-24 18:11:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |             timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit()
 | 
					
						
							| 
									
										
										
										
											2012-04-24 18:11:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-27 13:42:01 +08:00
										 |  |  |    .. method:: Timer.autorange(callback=None)
 | 
					
						
							| 
									
										
										
										
											2016-08-15 01:27:03 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-27 13:42:01 +08:00
										 |  |  |       Automatically determine how many times to call :meth:`.timeit`.
 | 
					
						
							| 
									
										
										
										
											2016-08-15 01:27:03 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-27 13:42:01 +08:00
										 |  |  |       This is a convenience function that calls :meth:`.timeit` repeatedly
 | 
					
						
							|  |  |  |       so that the total time >= 0.2 second, returning the eventual
 | 
					
						
							|  |  |  |       (number of loops, time taken for that number of loops). It calls
 | 
					
						
							|  |  |  |       :meth:`.timeit` with increasing numbers from the sequence 1, 2, 5,
 | 
					
						
							|  |  |  |       10, 20, 50, ... until the time taken is at least 0.2 second.
 | 
					
						
							| 
									
										
										
										
											2016-08-15 01:27:03 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-27 13:42:01 +08:00
										 |  |  |       If *callback* is given and is not ``None``, it will be called after
 | 
					
						
							|  |  |  |       each trial with two arguments: ``callback(number, time_taken)``.
 | 
					
						
							| 
									
										
										
										
											2016-08-15 01:27:03 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-27 13:42:01 +08:00
										 |  |  |       .. versionadded:: 3.6
 | 
					
						
							| 
									
										
										
										
											2016-08-15 02:47:49 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-15 01:27:03 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-06 17:55:18 +02:00
										 |  |  |    .. method:: Timer.repeat(repeat=5, number=1000000)
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |       Call :meth:`.timeit` a few times.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |       This is a convenience function that calls the :meth:`.timeit` repeatedly,
 | 
					
						
							|  |  |  |       returning a list of results.  The first argument specifies how many times
 | 
					
						
							|  |  |  |       to call :meth:`.timeit`.  The second argument specifies the *number*
 | 
					
						
							|  |  |  |       argument for :meth:`.timeit`.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |       .. note::
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |          It's tempting to calculate mean and standard deviation from the result
 | 
					
						
							|  |  |  |          vector and report these.  However, this is not very useful.
 | 
					
						
							|  |  |  |          In a typical case, the lowest value gives a lower bound for how fast
 | 
					
						
							|  |  |  |          your machine can run the given code snippet; higher values in the
 | 
					
						
							|  |  |  |          result vector are typically not caused by variability in Python's
 | 
					
						
							|  |  |  |          speed, but by other processes interfering with your timing accuracy.
 | 
					
						
							|  |  |  |          So the :func:`min` of the result is probably the only number you
 | 
					
						
							|  |  |  |          should be interested in.  After that, you should look at the entire
 | 
					
						
							|  |  |  |          vector and apply common sense rather than statistics.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-06 17:55:18 +02:00
										 |  |  |       .. versionchanged:: 3.7
 | 
					
						
							|  |  |  |          Default value of *repeat* changed from 3 to 5.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |    .. method:: Timer.print_exc(file=None)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Helper to print a traceback from the timed code.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Typical use::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          t = Timer(...)       # outside the try/except
 | 
					
						
							|  |  |  |          try:
 | 
					
						
							|  |  |  |              t.timeit(...)    # or t.repeat(...)
 | 
					
						
							| 
									
										
										
										
											2012-11-02 22:07:26 +02:00
										 |  |  |          except Exception:
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |              t.print_exc()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The advantage over the standard traceback is that source lines in the
 | 
					
						
							|  |  |  |       compiled template will be displayed.  The optional *file* argument directs
 | 
					
						
							|  |  |  |       where the traceback is sent; it defaults to :data:`sys.stderr`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-16 04:59:38 +00:00
										 |  |  | .. _timeit-command-line-interface:
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | Command-Line Interface
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | ----------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | When called as a program from the command line, the following form is used::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-18 17:18:21 +02:00
										 |  |  |    python -m timeit [-n N] [-r N] [-u U] [-s S] [-h] [statement ...]
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-18 16:38:46 +00:00
										 |  |  | Where the following options are understood:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. program:: timeit
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. cmdoption:: -n N, --number=N
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    how many times to execute 'statement'
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-18 16:38:46 +00:00
										 |  |  | .. cmdoption:: -r N, --repeat=N
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-06 17:55:18 +02:00
										 |  |  |    how many times to repeat the timer (default 5)
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-18 16:38:46 +00:00
										 |  |  | .. cmdoption:: -s S, --setup=S
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    statement to be executed once initially (default ``pass``)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-01 11:59:36 +02:00
										 |  |  | .. cmdoption:: -p, --process
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    measure process time, not wallclock time, using :func:`time.process_time`
 | 
					
						
							|  |  |  |    instead of :func:`time.perf_counter`, which is the default
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.3
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-18 09:54:50 +13:00
										 |  |  | .. cmdoption:: -u, --unit=U
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-18 17:42:48 +02:00
										 |  |  |     specify a time unit for timer output; can select nsec, usec, msec, or sec
 | 
					
						
							| 
									
										
										
										
											2015-03-18 09:54:50 +13:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.5
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-18 16:38:46 +00:00
										 |  |  | .. cmdoption:: -v, --verbose
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  |    print raw timing results; repeat for more digits precision
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-18 16:38:46 +00:00
										 |  |  | .. cmdoption:: -h, --help
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  |    print a short usage message and exit
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | A multi-line statement may be given by specifying each line as a separate
 | 
					
						
							|  |  |  | statement argument; indented lines are possible by enclosing an argument in
 | 
					
						
							|  |  |  | quotes and using leading spaces.  Multiple :option:`-s` options are treated
 | 
					
						
							|  |  |  | similarly.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | If :option:`-n` is not given, a suitable number of loops is calculated by trying
 | 
					
						
							|  |  |  | successive powers of 10 until the total time is at least 0.2 seconds.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-01 11:59:36 +02:00
										 |  |  | :func:`default_timer` measurements can be affected by other programs running on
 | 
					
						
							|  |  |  | the same machine, so the best thing to do when accurate timing is necessary is
 | 
					
						
							|  |  |  | to repeat the timing a few times and use the best time.  The :option:`-r`
 | 
					
						
							| 
									
										
										
										
											2018-06-06 17:55:18 +02:00
										 |  |  | option is good for this; the default of 5 repetitions is probably enough in
 | 
					
						
							| 
									
										
										
										
											2012-05-01 11:59:36 +02:00
										 |  |  | most cases.  You can use :func:`time.process_time` to measure CPU time.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    There is a certain baseline overhead associated with executing a pass statement.
 | 
					
						
							|  |  |  |    The code here doesn't try to hide it, but you should be aware of it.  The
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |    baseline overhead can be measured by invoking the program without arguments,
 | 
					
						
							|  |  |  |    and it might differ between Python versions.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  | .. _timeit-examples:
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Examples
 | 
					
						
							|  |  |  | --------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  | It is possible to provide a setup statement that is executed only once at the beginning:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-08 19:18:04 +03:00
										 |  |  | .. code-block:: shell-session
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |    $ python -m timeit -s 'text = "sample string"; char = "g"'  'char in text'
 | 
					
						
							| 
									
										
										
										
											2016-10-23 15:17:05 +03:00
										 |  |  |    5000000 loops, best of 5: 0.0877 usec per loop
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |    $ python -m timeit -s 'text = "sample string"; char = "g"'  'text.find(char)'
 | 
					
						
							| 
									
										
										
										
											2016-10-23 15:17:05 +03:00
										 |  |  |    1000000 loops, best of 5: 0.342 usec per loop
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | ::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    >>> import timeit
 | 
					
						
							|  |  |  |    >>> timeit.timeit('char in text', setup='text = "sample string"; char = "g"')
 | 
					
						
							|  |  |  |    0.41440500499993504
 | 
					
						
							|  |  |  |    >>> timeit.timeit('text.find(char)', setup='text = "sample string"; char = "g"')
 | 
					
						
							|  |  |  |    1.7246671520006203
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The same can be done using the :class:`Timer` class and its methods::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    >>> import timeit
 | 
					
						
							|  |  |  |    >>> t = timeit.Timer('char in text', setup='text = "sample string"; char = "g"')
 | 
					
						
							|  |  |  |    >>> t.timeit()
 | 
					
						
							|  |  |  |    0.3955516149999312
 | 
					
						
							|  |  |  |    >>> t.repeat()
 | 
					
						
							|  |  |  |    [0.40193588800002544, 0.3960157959998014, 0.39594301399984033]
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The following examples show how to time expressions that contain multiple lines.
 | 
					
						
							|  |  |  | Here we compare the cost of using :func:`hasattr` vs. :keyword:`try`/:keyword:`except`
 | 
					
						
							|  |  |  | to test for missing and present object attributes:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-08 19:18:04 +03:00
										 |  |  | .. code-block:: shell-session
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-06 13:37:04 +08:00
										 |  |  |    $ python -m timeit 'try:' '  str.__bool__' 'except AttributeError:' '  pass'
 | 
					
						
							| 
									
										
										
										
											2016-10-23 15:17:05 +03:00
										 |  |  |    20000 loops, best of 5: 15.7 usec per loop
 | 
					
						
							| 
									
										
										
										
											2011-08-06 13:37:04 +08:00
										 |  |  |    $ python -m timeit 'if hasattr(str, "__bool__"): pass'
 | 
					
						
							| 
									
										
										
										
											2016-10-23 15:17:05 +03:00
										 |  |  |    50000 loops, best of 5: 4.26 usec per loop
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-06 13:37:04 +08:00
										 |  |  |    $ python -m timeit 'try:' '  int.__bool__' 'except AttributeError:' '  pass'
 | 
					
						
							| 
									
										
										
										
											2016-10-23 15:17:05 +03:00
										 |  |  |    200000 loops, best of 5: 1.43 usec per loop
 | 
					
						
							| 
									
										
										
										
											2011-08-06 13:37:04 +08:00
										 |  |  |    $ python -m timeit 'if hasattr(int, "__bool__"): pass'
 | 
					
						
							| 
									
										
										
										
											2016-10-23 15:17:05 +03:00
										 |  |  |    100000 loops, best of 5: 2.23 usec per loop
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    >>> import timeit
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |    >>> # attribute is missing
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  |    >>> s = """\
 | 
					
						
							|  |  |  |    ... try:
 | 
					
						
							|  |  |  |    ...     str.__bool__
 | 
					
						
							|  |  |  |    ... except AttributeError:
 | 
					
						
							|  |  |  |    ...     pass
 | 
					
						
							|  |  |  |    ... """
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |    >>> timeit.timeit(stmt=s, number=100000)
 | 
					
						
							|  |  |  |    0.9138244460009446
 | 
					
						
							|  |  |  |    >>> s = "if hasattr(str, '__bool__'): pass"
 | 
					
						
							|  |  |  |    >>> timeit.timeit(stmt=s, number=100000)
 | 
					
						
							|  |  |  |    0.5829014980008651
 | 
					
						
							|  |  |  |    >>>
 | 
					
						
							|  |  |  |    >>> # attribute is present
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  |    >>> s = """\
 | 
					
						
							|  |  |  |    ... try:
 | 
					
						
							|  |  |  |    ...     int.__bool__
 | 
					
						
							|  |  |  |    ... except AttributeError:
 | 
					
						
							|  |  |  |    ...     pass
 | 
					
						
							|  |  |  |    ... """
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |    >>> timeit.timeit(stmt=s, number=100000)
 | 
					
						
							|  |  |  |    0.04215312199994514
 | 
					
						
							|  |  |  |    >>> s = "if hasattr(int, '__bool__'): pass"
 | 
					
						
							|  |  |  |    >>> timeit.timeit(stmt=s, number=100000)
 | 
					
						
							|  |  |  |    0.08588060699912603
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | To give the :mod:`timeit` module access to functions you define, you can pass a
 | 
					
						
							| 
									
										
										
										
											2012-09-20 06:13:38 +03:00
										 |  |  | *setup* parameter which contains an import statement::
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    def test():
 | 
					
						
							| 
									
										
										
										
											2011-08-06 13:37:04 +08:00
										 |  |  |        """Stupid test function"""
 | 
					
						
							| 
									
										
										
										
											2007-09-01 23:34:30 +00:00
										 |  |  |        L = [i for i in range(100)]
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-06 13:37:04 +08:00
										 |  |  |    if __name__ == '__main__':
 | 
					
						
							| 
									
										
										
										
											2012-10-02 05:35:39 +03:00
										 |  |  |        import timeit
 | 
					
						
							|  |  |  |        print(timeit.timeit("test()", setup="from __main__ import test"))
 | 
					
						
							| 
									
										
										
										
											2014-08-22 23:13:50 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | Another option is to pass :func:`globals` to the  *globals* parameter, which will cause the code
 | 
					
						
							|  |  |  | to be executed within your current global namespace.  This can be more convenient
 | 
					
						
							|  |  |  | than individually specifying imports::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    def f(x):
 | 
					
						
							|  |  |  |        return x**2
 | 
					
						
							|  |  |  |    def g(x):
 | 
					
						
							|  |  |  |        return x**4
 | 
					
						
							|  |  |  |    def h(x):
 | 
					
						
							|  |  |  |        return x**8
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    import timeit
 | 
					
						
							|  |  |  |    print(timeit.timeit('[func(42) for func in (f,g,h)]', globals=globals()))
 |