17db96d56Sopenharmony_ci:mod:`timeit` --- Measure execution time of small code snippets
27db96d56Sopenharmony_ci===============================================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: timeit
57db96d56Sopenharmony_ci   :synopsis: Measure the execution time of small code snippets.
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci**Source code:** :source:`Lib/timeit.py`
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci.. index::
107db96d56Sopenharmony_ci   single: Benchmarking
117db96d56Sopenharmony_ci   single: Performance
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci--------------
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ciThis module provides a simple way to time small bits of Python code. It has both
167db96d56Sopenharmony_cia :ref:`timeit-command-line-interface` as well as a :ref:`callable <python-interface>`
177db96d56Sopenharmony_cione.  It avoids a number of common traps for measuring execution times.
187db96d56Sopenharmony_ciSee also Tim Peters' introduction to the "Algorithms" chapter in the second
197db96d56Sopenharmony_ciedition of *Python Cookbook*, published by O'Reilly.
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ciBasic Examples
237db96d56Sopenharmony_ci--------------
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ciThe following example shows how the :ref:`timeit-command-line-interface`
267db96d56Sopenharmony_cican be used to compare three different expressions:
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci.. code-block:: shell-session
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci   $ python3 -m timeit '"-".join(str(n) for n in range(100))'
317db96d56Sopenharmony_ci   10000 loops, best of 5: 30.2 usec per loop
327db96d56Sopenharmony_ci   $ python3 -m timeit '"-".join([str(n) for n in range(100)])'
337db96d56Sopenharmony_ci   10000 loops, best of 5: 27.5 usec per loop
347db96d56Sopenharmony_ci   $ python3 -m timeit '"-".join(map(str, range(100)))'
357db96d56Sopenharmony_ci   10000 loops, best of 5: 23.2 usec per loop
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ciThis can be achieved from the :ref:`python-interface` with::
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ci   >>> import timeit
407db96d56Sopenharmony_ci   >>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
417db96d56Sopenharmony_ci   0.3018611848820001
427db96d56Sopenharmony_ci   >>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000)
437db96d56Sopenharmony_ci   0.2727368790656328
447db96d56Sopenharmony_ci   >>> timeit.timeit('"-".join(map(str, range(100)))', number=10000)
457db96d56Sopenharmony_ci   0.23702679807320237
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_ciA callable can also be passed from the :ref:`python-interface`::
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci   >>> timeit.timeit(lambda: "-".join(map(str, range(100))), number=10000)
507db96d56Sopenharmony_ci   0.19665591977536678
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ciNote however that :func:`.timeit` will automatically determine the number of
537db96d56Sopenharmony_cirepetitions only when the command-line interface is used.  In the
547db96d56Sopenharmony_ci:ref:`timeit-examples` section you can find more advanced examples.
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci.. _python-interface:
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ciPython Interface
607db96d56Sopenharmony_ci----------------
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ciThe module defines three convenience functions and a public class:
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci.. function:: timeit(stmt='pass', setup='pass', timer=<default timer>, number=1000000, globals=None)
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci   Create a :class:`Timer` instance with the given statement, *setup* code and
687db96d56Sopenharmony_ci   *timer* function and run its :meth:`.timeit` method with *number* executions.
697db96d56Sopenharmony_ci   The optional *globals* argument specifies a namespace in which to execute the
707db96d56Sopenharmony_ci   code.
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci   .. versionchanged:: 3.5
737db96d56Sopenharmony_ci      The optional *globals* parameter was added.
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ci.. function:: repeat(stmt='pass', setup='pass', timer=<default timer>, repeat=5, number=1000000, globals=None)
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci   Create a :class:`Timer` instance with the given statement, *setup* code and
797db96d56Sopenharmony_ci   *timer* function and run its :meth:`.repeat` method with the given *repeat*
807db96d56Sopenharmony_ci   count and *number* executions.  The optional *globals* argument specifies a
817db96d56Sopenharmony_ci   namespace in which to execute the code.
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ci   .. versionchanged:: 3.5
847db96d56Sopenharmony_ci      The optional *globals* parameter was added.
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci   .. versionchanged:: 3.7
877db96d56Sopenharmony_ci      Default value of *repeat* changed from 3 to 5.
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci.. function:: default_timer()
907db96d56Sopenharmony_ci
917db96d56Sopenharmony_ci   The default timer, which is always :func:`time.perf_counter`.
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci   .. versionchanged:: 3.3
947db96d56Sopenharmony_ci      :func:`time.perf_counter` is now the default timer.
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci.. class:: Timer(stmt='pass', setup='pass', timer=<timer function>, globals=None)
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ci   Class for timing execution speed of small code snippets.
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ci   The constructor takes a statement to be timed, an additional statement used
1027db96d56Sopenharmony_ci   for setup, and a timer function.  Both statements default to ``'pass'``;
1037db96d56Sopenharmony_ci   the timer function is platform-dependent (see the module doc string).
1047db96d56Sopenharmony_ci   *stmt* and *setup* may also contain multiple statements separated by ``;``
1057db96d56Sopenharmony_ci   or newlines, as long as they don't contain multi-line string literals.  The
1067db96d56Sopenharmony_ci   statement will by default be executed within timeit's namespace; this behavior
1077db96d56Sopenharmony_ci   can be controlled by passing a namespace to *globals*.
1087db96d56Sopenharmony_ci
1097db96d56Sopenharmony_ci   To measure the execution time of the first statement, use the :meth:`.timeit`
1107db96d56Sopenharmony_ci   method.  The :meth:`.repeat` and :meth:`.autorange` methods are convenience
1117db96d56Sopenharmony_ci   methods to call :meth:`.timeit` multiple times.
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci   The execution time of *setup* is excluded from the overall timed execution run.
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci   The *stmt* and *setup* parameters can also take objects that are callable
1167db96d56Sopenharmony_ci   without arguments.  This will embed calls to them in a timer function that
1177db96d56Sopenharmony_ci   will then be executed by :meth:`.timeit`.  Note that the timing overhead is a
1187db96d56Sopenharmony_ci   little larger in this case because of the extra function calls.
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci   .. versionchanged:: 3.5
1217db96d56Sopenharmony_ci      The optional *globals* parameter was added.
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ci   .. method:: Timer.timeit(number=1000000)
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ci      Time *number* executions of the main statement.  This executes the setup
1267db96d56Sopenharmony_ci      statement once, and then returns the time it takes to execute the main
1277db96d56Sopenharmony_ci      statement a number of times, measured in seconds as a float.
1287db96d56Sopenharmony_ci      The argument is the number of times through the loop, defaulting to one
1297db96d56Sopenharmony_ci      million.  The main statement, the setup statement and the timer function
1307db96d56Sopenharmony_ci      to be used are passed to the constructor.
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_ci      .. note::
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci         By default, :meth:`.timeit` temporarily turns off :term:`garbage
1357db96d56Sopenharmony_ci         collection` during the timing.  The advantage of this approach is that
1367db96d56Sopenharmony_ci         it makes independent timings more comparable.  The disadvantage is
1377db96d56Sopenharmony_ci         that GC may be an important component of the performance of the
1387db96d56Sopenharmony_ci         function being measured.  If so, GC can be re-enabled as the first
1397db96d56Sopenharmony_ci         statement in the *setup* string.  For example::
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci            timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit()
1427db96d56Sopenharmony_ci
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci   .. method:: Timer.autorange(callback=None)
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_ci      Automatically determine how many times to call :meth:`.timeit`.
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ci      This is a convenience function that calls :meth:`.timeit` repeatedly
1497db96d56Sopenharmony_ci      so that the total time >= 0.2 second, returning the eventual
1507db96d56Sopenharmony_ci      (number of loops, time taken for that number of loops). It calls
1517db96d56Sopenharmony_ci      :meth:`.timeit` with increasing numbers from the sequence 1, 2, 5,
1527db96d56Sopenharmony_ci      10, 20, 50, ... until the time taken is at least 0.2 second.
1537db96d56Sopenharmony_ci
1547db96d56Sopenharmony_ci      If *callback* is given and is not ``None``, it will be called after
1557db96d56Sopenharmony_ci      each trial with two arguments: ``callback(number, time_taken)``.
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_ci      .. versionadded:: 3.6
1587db96d56Sopenharmony_ci
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ci   .. method:: Timer.repeat(repeat=5, number=1000000)
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ci      Call :meth:`.timeit` a few times.
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci      This is a convenience function that calls the :meth:`.timeit` repeatedly,
1657db96d56Sopenharmony_ci      returning a list of results.  The first argument specifies how many times
1667db96d56Sopenharmony_ci      to call :meth:`.timeit`.  The second argument specifies the *number*
1677db96d56Sopenharmony_ci      argument for :meth:`.timeit`.
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ci      .. note::
1707db96d56Sopenharmony_ci
1717db96d56Sopenharmony_ci         It's tempting to calculate mean and standard deviation from the result
1727db96d56Sopenharmony_ci         vector and report these.  However, this is not very useful.
1737db96d56Sopenharmony_ci         In a typical case, the lowest value gives a lower bound for how fast
1747db96d56Sopenharmony_ci         your machine can run the given code snippet; higher values in the
1757db96d56Sopenharmony_ci         result vector are typically not caused by variability in Python's
1767db96d56Sopenharmony_ci         speed, but by other processes interfering with your timing accuracy.
1777db96d56Sopenharmony_ci         So the :func:`min` of the result is probably the only number you
1787db96d56Sopenharmony_ci         should be interested in.  After that, you should look at the entire
1797db96d56Sopenharmony_ci         vector and apply common sense rather than statistics.
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ci      .. versionchanged:: 3.7
1827db96d56Sopenharmony_ci         Default value of *repeat* changed from 3 to 5.
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ci   .. method:: Timer.print_exc(file=None)
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_ci      Helper to print a traceback from the timed code.
1887db96d56Sopenharmony_ci
1897db96d56Sopenharmony_ci      Typical use::
1907db96d56Sopenharmony_ci
1917db96d56Sopenharmony_ci         t = Timer(...)       # outside the try/except
1927db96d56Sopenharmony_ci         try:
1937db96d56Sopenharmony_ci             t.timeit(...)    # or t.repeat(...)
1947db96d56Sopenharmony_ci         except Exception:
1957db96d56Sopenharmony_ci             t.print_exc()
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ci      The advantage over the standard traceback is that source lines in the
1987db96d56Sopenharmony_ci      compiled template will be displayed.  The optional *file* argument directs
1997db96d56Sopenharmony_ci      where the traceback is sent; it defaults to :data:`sys.stderr`.
2007db96d56Sopenharmony_ci
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ci.. _timeit-command-line-interface:
2037db96d56Sopenharmony_ci
2047db96d56Sopenharmony_ciCommand-Line Interface
2057db96d56Sopenharmony_ci----------------------
2067db96d56Sopenharmony_ci
2077db96d56Sopenharmony_ciWhen called as a program from the command line, the following form is used::
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ci   python -m timeit [-n N] [-r N] [-u U] [-s S] [-h] [statement ...]
2107db96d56Sopenharmony_ci
2117db96d56Sopenharmony_ciWhere the following options are understood:
2127db96d56Sopenharmony_ci
2137db96d56Sopenharmony_ci.. program:: timeit
2147db96d56Sopenharmony_ci
2157db96d56Sopenharmony_ci.. cmdoption:: -n N, --number=N
2167db96d56Sopenharmony_ci
2177db96d56Sopenharmony_ci   how many times to execute 'statement'
2187db96d56Sopenharmony_ci
2197db96d56Sopenharmony_ci.. cmdoption:: -r N, --repeat=N
2207db96d56Sopenharmony_ci
2217db96d56Sopenharmony_ci   how many times to repeat the timer (default 5)
2227db96d56Sopenharmony_ci
2237db96d56Sopenharmony_ci.. cmdoption:: -s S, --setup=S
2247db96d56Sopenharmony_ci
2257db96d56Sopenharmony_ci   statement to be executed once initially (default ``pass``)
2267db96d56Sopenharmony_ci
2277db96d56Sopenharmony_ci.. cmdoption:: -p, --process
2287db96d56Sopenharmony_ci
2297db96d56Sopenharmony_ci   measure process time, not wallclock time, using :func:`time.process_time`
2307db96d56Sopenharmony_ci   instead of :func:`time.perf_counter`, which is the default
2317db96d56Sopenharmony_ci
2327db96d56Sopenharmony_ci   .. versionadded:: 3.3
2337db96d56Sopenharmony_ci
2347db96d56Sopenharmony_ci.. cmdoption:: -u, --unit=U
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ci   specify a time unit for timer output; can select ``nsec``, ``usec``, ``msec``, or ``sec``
2377db96d56Sopenharmony_ci
2387db96d56Sopenharmony_ci   .. versionadded:: 3.5
2397db96d56Sopenharmony_ci
2407db96d56Sopenharmony_ci.. cmdoption:: -v, --verbose
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ci   print raw timing results; repeat for more digits precision
2437db96d56Sopenharmony_ci
2447db96d56Sopenharmony_ci.. cmdoption:: -h, --help
2457db96d56Sopenharmony_ci
2467db96d56Sopenharmony_ci   print a short usage message and exit
2477db96d56Sopenharmony_ci
2487db96d56Sopenharmony_ciA multi-line statement may be given by specifying each line as a separate
2497db96d56Sopenharmony_cistatement argument; indented lines are possible by enclosing an argument in
2507db96d56Sopenharmony_ciquotes and using leading spaces.  Multiple :option:`-s` options are treated
2517db96d56Sopenharmony_cisimilarly.
2527db96d56Sopenharmony_ci
2537db96d56Sopenharmony_ciIf :option:`-n` is not given, a suitable number of loops is calculated by trying
2547db96d56Sopenharmony_ciincreasing numbers from the sequence 1, 2, 5, 10, 20, 50, ... until the total
2557db96d56Sopenharmony_citime is at least 0.2 seconds.
2567db96d56Sopenharmony_ci
2577db96d56Sopenharmony_ci:func:`default_timer` measurements can be affected by other programs running on
2587db96d56Sopenharmony_cithe same machine, so the best thing to do when accurate timing is necessary is
2597db96d56Sopenharmony_cito repeat the timing a few times and use the best time.  The :option:`-r`
2607db96d56Sopenharmony_cioption is good for this; the default of 5 repetitions is probably enough in
2617db96d56Sopenharmony_cimost cases.  You can use :func:`time.process_time` to measure CPU time.
2627db96d56Sopenharmony_ci
2637db96d56Sopenharmony_ci.. note::
2647db96d56Sopenharmony_ci
2657db96d56Sopenharmony_ci   There is a certain baseline overhead associated with executing a pass statement.
2667db96d56Sopenharmony_ci   The code here doesn't try to hide it, but you should be aware of it.  The
2677db96d56Sopenharmony_ci   baseline overhead can be measured by invoking the program without arguments,
2687db96d56Sopenharmony_ci   and it might differ between Python versions.
2697db96d56Sopenharmony_ci
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ci.. _timeit-examples:
2727db96d56Sopenharmony_ci
2737db96d56Sopenharmony_ciExamples
2747db96d56Sopenharmony_ci--------
2757db96d56Sopenharmony_ci
2767db96d56Sopenharmony_ciIt is possible to provide a setup statement that is executed only once at the beginning:
2777db96d56Sopenharmony_ci
2787db96d56Sopenharmony_ci.. code-block:: shell-session
2797db96d56Sopenharmony_ci
2807db96d56Sopenharmony_ci   $ python -m timeit -s 'text = "sample string"; char = "g"'  'char in text'
2817db96d56Sopenharmony_ci   5000000 loops, best of 5: 0.0877 usec per loop
2827db96d56Sopenharmony_ci   $ python -m timeit -s 'text = "sample string"; char = "g"'  'text.find(char)'
2837db96d56Sopenharmony_ci   1000000 loops, best of 5: 0.342 usec per loop
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ciIn the output, there are three fields. The loop count, which tells you how many
2867db96d56Sopenharmony_citimes the statement body was run per timing loop repetition. The repetition
2877db96d56Sopenharmony_cicount ('best of 5') which tells you how many times the timing loop was
2887db96d56Sopenharmony_cirepeated, and finally the time the statement body took on average within the
2897db96d56Sopenharmony_cibest repetition of the timing loop. That is, the time the fastest repetition
2907db96d56Sopenharmony_citook divided by the loop count.
2917db96d56Sopenharmony_ci
2927db96d56Sopenharmony_ci::
2937db96d56Sopenharmony_ci
2947db96d56Sopenharmony_ci   >>> import timeit
2957db96d56Sopenharmony_ci   >>> timeit.timeit('char in text', setup='text = "sample string"; char = "g"')
2967db96d56Sopenharmony_ci   0.41440500499993504
2977db96d56Sopenharmony_ci   >>> timeit.timeit('text.find(char)', setup='text = "sample string"; char = "g"')
2987db96d56Sopenharmony_ci   1.7246671520006203
2997db96d56Sopenharmony_ci
3007db96d56Sopenharmony_ciThe same can be done using the :class:`Timer` class and its methods::
3017db96d56Sopenharmony_ci
3027db96d56Sopenharmony_ci   >>> import timeit
3037db96d56Sopenharmony_ci   >>> t = timeit.Timer('char in text', setup='text = "sample string"; char = "g"')
3047db96d56Sopenharmony_ci   >>> t.timeit()
3057db96d56Sopenharmony_ci   0.3955516149999312
3067db96d56Sopenharmony_ci   >>> t.repeat()
3077db96d56Sopenharmony_ci   [0.40183617287970225, 0.37027556854118704, 0.38344867356679524, 0.3712595970846668, 0.37866875250654886]
3087db96d56Sopenharmony_ci
3097db96d56Sopenharmony_ci
3107db96d56Sopenharmony_ciThe following examples show how to time expressions that contain multiple lines.
3117db96d56Sopenharmony_ciHere we compare the cost of using :func:`hasattr` vs. :keyword:`try`/:keyword:`except`
3127db96d56Sopenharmony_cito test for missing and present object attributes:
3137db96d56Sopenharmony_ci
3147db96d56Sopenharmony_ci.. code-block:: shell-session
3157db96d56Sopenharmony_ci
3167db96d56Sopenharmony_ci   $ python -m timeit 'try:' '  str.__bool__' 'except AttributeError:' '  pass'
3177db96d56Sopenharmony_ci   20000 loops, best of 5: 15.7 usec per loop
3187db96d56Sopenharmony_ci   $ python -m timeit 'if hasattr(str, "__bool__"): pass'
3197db96d56Sopenharmony_ci   50000 loops, best of 5: 4.26 usec per loop
3207db96d56Sopenharmony_ci
3217db96d56Sopenharmony_ci   $ python -m timeit 'try:' '  int.__bool__' 'except AttributeError:' '  pass'
3227db96d56Sopenharmony_ci   200000 loops, best of 5: 1.43 usec per loop
3237db96d56Sopenharmony_ci   $ python -m timeit 'if hasattr(int, "__bool__"): pass'
3247db96d56Sopenharmony_ci   100000 loops, best of 5: 2.23 usec per loop
3257db96d56Sopenharmony_ci
3267db96d56Sopenharmony_ci::
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ci   >>> import timeit
3297db96d56Sopenharmony_ci   >>> # attribute is missing
3307db96d56Sopenharmony_ci   >>> s = """\
3317db96d56Sopenharmony_ci   ... try:
3327db96d56Sopenharmony_ci   ...     str.__bool__
3337db96d56Sopenharmony_ci   ... except AttributeError:
3347db96d56Sopenharmony_ci   ...     pass
3357db96d56Sopenharmony_ci   ... """
3367db96d56Sopenharmony_ci   >>> timeit.timeit(stmt=s, number=100000)
3377db96d56Sopenharmony_ci   0.9138244460009446
3387db96d56Sopenharmony_ci   >>> s = "if hasattr(str, '__bool__'): pass"
3397db96d56Sopenharmony_ci   >>> timeit.timeit(stmt=s, number=100000)
3407db96d56Sopenharmony_ci   0.5829014980008651
3417db96d56Sopenharmony_ci   >>>
3427db96d56Sopenharmony_ci   >>> # attribute is present
3437db96d56Sopenharmony_ci   >>> s = """\
3447db96d56Sopenharmony_ci   ... try:
3457db96d56Sopenharmony_ci   ...     int.__bool__
3467db96d56Sopenharmony_ci   ... except AttributeError:
3477db96d56Sopenharmony_ci   ...     pass
3487db96d56Sopenharmony_ci   ... """
3497db96d56Sopenharmony_ci   >>> timeit.timeit(stmt=s, number=100000)
3507db96d56Sopenharmony_ci   0.04215312199994514
3517db96d56Sopenharmony_ci   >>> s = "if hasattr(int, '__bool__'): pass"
3527db96d56Sopenharmony_ci   >>> timeit.timeit(stmt=s, number=100000)
3537db96d56Sopenharmony_ci   0.08588060699912603
3547db96d56Sopenharmony_ci
3557db96d56Sopenharmony_ci
3567db96d56Sopenharmony_ciTo give the :mod:`timeit` module access to functions you define, you can pass a
3577db96d56Sopenharmony_ci*setup* parameter which contains an import statement::
3587db96d56Sopenharmony_ci
3597db96d56Sopenharmony_ci   def test():
3607db96d56Sopenharmony_ci       """Stupid test function"""
3617db96d56Sopenharmony_ci       L = [i for i in range(100)]
3627db96d56Sopenharmony_ci
3637db96d56Sopenharmony_ci   if __name__ == '__main__':
3647db96d56Sopenharmony_ci       import timeit
3657db96d56Sopenharmony_ci       print(timeit.timeit("test()", setup="from __main__ import test"))
3667db96d56Sopenharmony_ci
3677db96d56Sopenharmony_ciAnother option is to pass :func:`globals` to the  *globals* parameter, which will cause the code
3687db96d56Sopenharmony_cito be executed within your current global namespace.  This can be more convenient
3697db96d56Sopenharmony_cithan individually specifying imports::
3707db96d56Sopenharmony_ci
3717db96d56Sopenharmony_ci   def f(x):
3727db96d56Sopenharmony_ci       return x**2
3737db96d56Sopenharmony_ci   def g(x):
3747db96d56Sopenharmony_ci       return x**4
3757db96d56Sopenharmony_ci   def h(x):
3767db96d56Sopenharmony_ci       return x**8
3777db96d56Sopenharmony_ci
3787db96d56Sopenharmony_ci   import timeit
3797db96d56Sopenharmony_ci   print(timeit.timeit('[func(42) for func in (f,g,h)]', globals=globals()))
380