Ignore:
Timestamp:
Mar 19, 2014, 11:31:01 PM (11 years ago)
Author:
dmik
Message:

python: Merge vendor 2.7.6 to trunk.

Location:
python/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • python/trunk

  • python/trunk/Doc/library/timeit.rst

    r2 r391  
    1 
    21:mod:`timeit` --- Measure execution time of small code snippets
    32===============================================================
     
    1312   single: Performance
    1413
     14**Source code:** :source:`Lib/timeit.py`
     15
     16--------------
     17
    1518This module provides a simple way to time small bits of Python code. It has both
    16 command line as well as callable interfaces.  It avoids a number of common traps
    17 for measuring execution times.  See also Tim Peters' introduction to the
    18 "Algorithms" chapter in the Python Cookbook, published by O'Reilly.
    19 
    20 The module defines the following public class:
    21 
    22 
    23 .. class:: Timer([stmt='pass' [, setup='pass' [, timer=<timer function>]]])
     19a :ref:`command-line-interface` as well as a :ref:`callable <python-interface>`
     20one.  It avoids a number of common traps for measuring execution times.
     21See also Tim Peters' introduction to the "Algorithms" chapter in the *Python
     22Cookbook*, published by O'Reilly.
     23
     24
     25Basic Examples
     26--------------
     27
     28The following example shows how the :ref:`command-line-interface`
     29can be used to compare three different expressions:
     30
     31.. code-block:: sh
     32
     33   $ python -m timeit '"-".join(str(n) for n in range(100))'
     34   10000 loops, best of 3: 40.3 usec per loop
     35   $ python -m timeit '"-".join([str(n) for n in range(100)])'
     36   10000 loops, best of 3: 33.4 usec per loop
     37   $ python -m timeit '"-".join(map(str, range(100)))'
     38   10000 loops, best of 3: 25.2 usec per loop
     39
     40This can be achieved from the :ref:`python-interface` with::
     41
     42   >>> import timeit
     43   >>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
     44   0.8187260627746582
     45   >>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000)
     46   0.7288308143615723
     47   >>> timeit.timeit('"-".join(map(str, range(100)))', number=10000)
     48   0.5858950614929199
     49
     50Note however that :mod:`timeit` will automatically determine the number of
     51repetitions only when the command-line interface is used.  In the
     52:ref:`timeit-examples` section you can find more advanced examples.
     53
     54
     55.. _python-interface:
     56
     57Python Interface
     58----------------
     59
     60The module defines three convenience functions and a public class:
     61
     62
     63.. function:: timeit(stmt='pass', setup='pass', timer=<default timer>, number=1000000)
     64
     65   Create a :class:`Timer` instance with the given statement, *setup* code and
     66   *timer* function and run its :meth:`.timeit` method with *number* executions.
     67
     68   .. versionadded:: 2.6
     69
     70
     71.. function:: repeat(stmt='pass', setup='pass', timer=<default timer>, repeat=3, number=1000000)
     72
     73   Create a :class:`Timer` instance with the given statement, *setup* code and
     74   *timer* function and run its :meth:`.repeat` method with the given *repeat*
     75   count and *number* executions.
     76
     77   .. versionadded:: 2.6
     78
     79
     80.. function:: default_timer()
     81
     82   Define a default timer, in a platform-specific manner.  On Windows,
     83   :func:`time.clock` has microsecond granularity, but :func:`time.time`'s
     84   granularity is 1/60th of a second.  On Unix, :func:`time.clock` has 1/100th of
     85   a second granularity, and :func:`time.time` is much more precise.  On either
     86   platform, :func:`default_timer` measures wall clock time, not the CPU
     87   time.  This means that other processes running on the same computer may
     88   interfere with the timing.
     89
     90
     91.. class:: Timer(stmt='pass', setup='pass', timer=<timer function>)
    2492
    2593   Class for timing execution speed of small code snippets.
    2694
    27    The constructor takes a statement to be timed, an additional statement used for
    28    setup, and a timer function.  Both statements default to ``'pass'``; the timer
    29    function is platform-dependent (see the module doc string).  *stmt* and *setup*
    30    may also contain multiple statements separated by ``;`` or newlines, as long as
    31    they don't contain multi-line string literals.
    32 
    33    To measure the execution time of the first statement, use the :meth:`timeit`
    34    method.  The :meth:`repeat` method is a convenience to call :meth:`timeit`
     95   The constructor takes a statement to be timed, an additional statement used
     96   for setup, and a timer function.  Both statements default to ``'pass'``;
     97   the timer function is platform-dependent (see the module doc string).
     98   *stmt* and *setup* may also contain multiple statements separated by ``;``
     99   or newlines, as long as they don't contain multi-line string literals.
     100
     101   To measure the execution time of the first statement, use the :meth:`.timeit`
     102   method.  The :meth:`.repeat` method is a convenience to call :meth:`.timeit`
    35103   multiple times and return a list of results.
    36104
    37105   .. versionchanged:: 2.6
    38       The *stmt* and *setup* parameters can now also take objects that are callable
    39       without arguments. This will embed calls to them in a timer function that will
    40       then be executed by :meth:`timeit`.  Note that the timing overhead is a little
    41       larger in this case because of the extra function calls.
    42 
    43 
    44 .. method:: Timer.print_exc([file=None])
    45 
    46    Helper to print a traceback from the timed code.
    47 
    48    Typical use::
    49 
    50       t = Timer(...)       # outside the try/except
    51       try:
    52           t.timeit(...)    # or t.repeat(...)
    53       except:
    54           t.print_exc()
    55 
    56    The advantage over the standard traceback is that source lines in the compiled
    57    template will be displayed. The optional *file* argument directs where the
    58    traceback is sent; it defaults to ``sys.stderr``.
    59 
    60 
    61 .. method:: Timer.repeat([repeat=3 [, number=1000000]])
    62 
    63    Call :meth:`timeit` a few times.
    64 
    65    This is a convenience function that calls the :meth:`timeit` repeatedly,
    66    returning a list of results.  The first argument specifies how many times to
    67    call :meth:`timeit`.  The second argument specifies the *number* argument for
    68    :func:`timeit`.
    69 
    70    .. note::
    71 
    72       It's tempting to calculate mean and standard deviation from the result vector
    73       and report these.  However, this is not very useful.  In a typical case, the
    74       lowest value gives a lower bound for how fast your machine can run the given
    75       code snippet; higher values in the result vector are typically not caused by
    76       variability in Python's speed, but by other processes interfering with your
    77       timing accuracy.  So the :func:`min` of the result is probably the only number
    78       you should be interested in.  After that, you should look at the entire vector
    79       and apply common sense rather than statistics.
    80 
    81 
    82 .. method:: Timer.timeit([number=1000000])
    83 
    84    Time *number* executions of the main statement. This executes the setup
    85    statement once, and then returns the time it takes to execute the main statement
    86    a number of times, measured in seconds as a float.  The argument is the number
    87    of times through the loop, defaulting to one million.  The main statement, the
    88    setup statement and the timer function to be used are passed to the constructor.
    89 
    90    .. note::
    91 
    92       By default, :meth:`timeit` temporarily turns off :term:`garbage collection`
    93       during the timing.  The advantage of this approach is that it makes
    94       independent timings more comparable.  This disadvantage is that GC may be
    95       an important component of the performance of the function being measured.
    96       If so, GC can be re-enabled as the first statement in the *setup* string.
    97       For example::
    98 
    99          timeit.Timer('for i in xrange(10): oct(i)', 'gc.enable()').timeit()
    100 
    101 Starting with version 2.6, the module also defines two convenience functions:
    102 
    103 
    104 .. function:: repeat(stmt[, setup[, timer[, repeat=3 [, number=1000000]]]])
    105 
    106    Create a :class:`Timer` instance with the given statement, setup code and timer
    107    function and run its :meth:`repeat` method with the given repeat count and
    108    *number* executions.
    109 
    110    .. versionadded:: 2.6
    111 
    112 
    113 .. function:: timeit(stmt[, setup[, timer[, number=1000000]]])
    114 
    115    Create a :class:`Timer` instance with the given statement, setup code and timer
    116    function and run its :meth:`timeit` method with *number* executions.
    117 
    118    .. versionadded:: 2.6
    119 
    120 
    121 Command Line Interface
     106      The *stmt* and *setup* parameters can now also take objects that are
     107      callable without arguments.  This will embed calls to them in a timer
     108      function that will then be executed by :meth:`.timeit`.  Note that the
     109      timing overhead is a little larger in this case because of the extra
     110      function calls.
     111
     112
     113   .. method:: Timer.timeit(number=1000000)
     114
     115      Time *number* executions of the main statement.  This executes the setup
     116      statement once, and then returns the time it takes to execute the main
     117      statement a number of times, measured in seconds as a float.
     118      The argument is the number of times through the loop, defaulting to one
     119      million.  The main statement, the setup statement and the timer function
     120      to be used are passed to the constructor.
     121
     122      .. note::
     123
     124         By default, :meth:`.timeit` temporarily turns off :term:`garbage
     125         collection` during the timing.  The advantage of this approach is that
     126         it makes independent timings more comparable.  This disadvantage is
     127         that GC may be an important component of the performance of the
     128         function being measured.  If so, GC can be re-enabled as the first
     129         statement in the *setup* string.  For example::
     130
     131            timeit.Timer('for i in xrange(10): oct(i)', 'gc.enable()').timeit()
     132
     133
     134   .. method:: Timer.repeat(repeat=3, number=1000000)
     135
     136      Call :meth:`.timeit` a few times.
     137
     138      This is a convenience function that calls the :meth:`.timeit` repeatedly,
     139      returning a list of results.  The first argument specifies how many times
     140      to call :meth:`.timeit`.  The second argument specifies the *number*
     141      argument for :meth:`.timeit`.
     142
     143      .. note::
     144
     145         It's tempting to calculate mean and standard deviation from the result
     146         vector and report these.  However, this is not very useful.
     147         In a typical case, the lowest value gives a lower bound for how fast
     148         your machine can run the given code snippet; higher values in the
     149         result vector are typically not caused by variability in Python's
     150         speed, but by other processes interfering with your timing accuracy.
     151         So the :func:`min` of the result is probably the only number you
     152         should be interested in.  After that, you should look at the entire
     153         vector and apply common sense rather than statistics.
     154
     155
     156   .. method:: Timer.print_exc(file=None)
     157
     158      Helper to print a traceback from the timed code.
     159
     160      Typical use::
     161
     162         t = Timer(...)       # outside the try/except
     163         try:
     164             t.timeit(...)    # or t.repeat(...)
     165         except:
     166             t.print_exc()
     167
     168      The advantage over the standard traceback is that source lines in the
     169      compiled template will be displayed. The optional *file* argument directs
     170      where the traceback is sent; it defaults to :data:`sys.stderr`.
     171
     172
     173.. _command-line-interface:
     174
     175Command-Line Interface
    122176----------------------
    123177
     
    126180   python -m timeit [-n N] [-r N] [-s S] [-t] [-c] [-h] [statement ...]
    127181
    128 where the following options are understood:
    129 
    130 -n N/:option:`--number=N`
     182Where the following options are understood:
     183
     184.. program:: timeit
     185
     186.. cmdoption:: -n N, --number=N
     187
    131188   how many times to execute 'statement'
    132189
    133 -r N/:option:`--repeat=N`
     190.. cmdoption:: -r N, --repeat=N
     191
    134192   how many times to repeat the timer (default 3)
    135193
    136 -s S/:option:`--setup=S`
    137    statement to be executed once initially (default ``'pass'``)
    138 
    139 -t/:option:`--time`
     194.. cmdoption:: -s S, --setup=S
     195
     196   statement to be executed once initially (default ``pass``)
     197
     198.. cmdoption:: -t, --time
     199
    140200   use :func:`time.time` (default on all platforms but Windows)
    141201
    142 -c/:option:`--clock`
     202.. cmdoption:: -c, --clock
     203
    143204   use :func:`time.clock` (default on Windows)
    144205
    145 -v/:option:`--verbose`
     206.. cmdoption:: -v, --verbose
     207
    146208   print raw timing results; repeat for more digits precision
    147209
    148 -h/:option:`--help`
     210.. cmdoption:: -h, --help
     211
    149212   print a short usage message and exit
    150213
     
    157220successive powers of 10 until the total time is at least 0.2 seconds.
    158221
    159 The default timer function is platform dependent.  On Windows,
    160 :func:`time.clock` has microsecond granularity but :func:`time.time`'s
    161 granularity is 1/60th of a second; on Unix, :func:`time.clock` has 1/100th of a
    162 second granularity and :func:`time.time` is much more precise.  On either
    163 platform, the default timer functions measure wall clock time, not the CPU time.
    164 This means that other processes running on the same computer may interfere with
    165 the timing.  The best thing to do when accurate timing is necessary is to repeat
     222:func:`default_timer` measurations can be affected by other programs running on
     223the same machine, so
     224the best thing to do when accurate timing is necessary is to repeat
    166225the timing a few times and use the best time.  The :option:`-r` option is good
    167226for this; the default of 3 repetitions is probably enough in most cases.  On
     
    172231   There is a certain baseline overhead associated with executing a pass statement.
    173232   The code here doesn't try to hide it, but you should be aware of it.  The
    174    baseline overhead can be measured by invoking the program without arguments.
    175 
    176 The baseline overhead differs between Python versions!  Also, to fairly compare
    177 older Python versions to Python 2.3, you may want to use Python's :option:`-O`
    178 option for the older versions to avoid timing ``SET_LINENO`` instructions.
    179 
     233   baseline overhead can be measured by invoking the program without arguments, and
     234   it might differ between Python versions.  Also, to fairly compare older Python
     235   versions to Python 2.3, you may want to use Python's :option:`-O` option for
     236   the older versions to avoid timing ``SET_LINENO`` instructions.
     237
     238
     239.. _timeit-examples:
    180240
    181241Examples
    182242--------
    183243
    184 Here are two example sessions (one using the command line, one using the module
    185 interface) that compare the cost of using :func:`hasattr` vs.
    186 :keyword:`try`/:keyword:`except` to test for missing and present object
    187 attributes. ::
    188 
    189    % timeit.py 'try:' '  str.__nonzero__' 'except AttributeError:' '  pass'
     244It is possible to provide a setup statement that is executed only once at the beginning:
     245
     246.. code-block:: sh
     247
     248   $ python -m timeit -s 'text = "sample string"; char = "g"'  'char in text'
     249   10000000 loops, best of 3: 0.0877 usec per loop
     250   $ python -m timeit -s 'text = "sample string"; char = "g"'  'text.find(char)'
     251   1000000 loops, best of 3: 0.342 usec per loop
     252
     253::
     254
     255   >>> import timeit
     256   >>> timeit.timeit('char in text', setup='text = "sample string"; char = "g"')
     257   0.41440500499993504
     258   >>> timeit.timeit('text.find(char)', setup='text = "sample string"; char = "g"')
     259   1.7246671520006203
     260
     261The same can be done using the :class:`Timer` class and its methods::
     262
     263   >>> import timeit
     264   >>> t = timeit.Timer('char in text', setup='text = "sample string"; char = "g"')
     265   >>> t.timeit()
     266   0.3955516149999312
     267   >>> t.repeat()
     268   [0.40193588800002544, 0.3960157959998014, 0.39594301399984033]
     269
     270
     271The following examples show how to time expressions that contain multiple lines.
     272Here we compare the cost of using :func:`hasattr` vs. :keyword:`try`/:keyword:`except`
     273to test for missing and present object attributes:
     274
     275.. code-block:: sh
     276
     277   $ python -m timeit 'try:' '  str.__nonzero__' 'except AttributeError:' '  pass'
    190278   100000 loops, best of 3: 15.7 usec per loop
    191    % timeit.py 'if hasattr(str, "__nonzero__"): pass'
     279   $ python -m timeit 'if hasattr(str, "__nonzero__"): pass'
    192280   100000 loops, best of 3: 4.26 usec per loop
    193    % timeit.py 'try:' '  int.__nonzero__' 'except AttributeError:' '  pass'
     281
     282   $ python -m timeit 'try:' '  int.__nonzero__' 'except AttributeError:' '  pass'
    194283   1000000 loops, best of 3: 1.43 usec per loop
    195    % timeit.py 'if hasattr(int, "__nonzero__"): pass'
     284   $ python -m timeit 'if hasattr(int, "__nonzero__"): pass'
    196285   100000 loops, best of 3: 2.23 usec per loop
    197286
     
    199288
    200289   >>> import timeit
     290   >>> # attribute is missing
    201291   >>> s = """\
    202292   ... try:
     
    205295   ...     pass
    206296   ... """
    207    >>> t = timeit.Timer(stmt=s)
    208    >>> print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)
    209    17.09 usec/pass
    210    >>> s = """\
    211    ... if hasattr(str, '__nonzero__'): pass
    212    ... """
    213    >>> t = timeit.Timer(stmt=s)
    214    >>> print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)
    215    4.85 usec/pass
     297   >>> timeit.timeit(stmt=s, number=100000)
     298   0.9138244460009446
     299   >>> s = "if hasattr(str, '__bool__'): pass"
     300   >>> timeit.timeit(stmt=s, number=100000)
     301   0.5829014980008651
     302   >>>
     303   >>> # attribute is present
    216304   >>> s = """\
    217305   ... try:
     
    220308   ...     pass
    221309   ... """
    222    >>> t = timeit.Timer(stmt=s)
    223    >>> print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)
    224    1.97 usec/pass
    225    >>> s = """\
    226    ... if hasattr(int, '__nonzero__'): pass
    227    ... """
    228    >>> t = timeit.Timer(stmt=s)
    229    >>> print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)
    230    3.15 usec/pass
     310   >>> timeit.timeit(stmt=s, number=100000)
     311   0.04215312199994514
     312   >>> s = "if hasattr(int, '__bool__'): pass"
     313   >>> timeit.timeit(stmt=s, number=100000)
     314   0.08588060699912603
    231315
    232316To give the :mod:`timeit` module access to functions you define, you can pass a
    233 ``setup`` parameter which contains an import statement::
     317*setup* parameter which contains an import statement::
    234318
    235319   def test():
    236        "Stupid test function"
     320       """Stupid test function"""
    237321       L = []
    238322       for i in range(100):
    239323           L.append(i)
    240324
    241    if __name__=='__main__':
    242        from timeit import Timer
    243        t = Timer("test()", "from __main__ import test")
    244        print t.timeit()
    245 
     325   if __name__ == '__main__':
     326       import timeit
     327       print(timeit.timeit("test()", setup="from __main__ import test"))
Note: See TracChangeset for help on using the changeset viewer.