]> granicus.if.org Git - python/commitdiff
#15979: merge with 3.2.
authorEzio Melotti <ezio.melotti@gmail.com>
Tue, 2 Oct 2012 03:01:16 +0000 (06:01 +0300)
committerEzio Melotti <ezio.melotti@gmail.com>
Tue, 2 Oct 2012 03:01:16 +0000 (06:01 +0300)
1  2 
Doc/library/timeit.rst
Misc/NEWS

index 6989b1cdf30146bd6e594639c6f37f930ff8c9cd,a3ec66f2fbea0264ee20bb0b368038832ea1760d..a4879179249176a55b9880168401215c65e579ce
  --------------
  
  This module provides a simple way to time small bits of Python code. It has both
- command line as well as callable interfaces.  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.
+ a :ref:`command-line-interface` as well as a :ref:`callable <python-interface>`
+ 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.
  
- The module defines the following public class:
  
+ Basic Examples
+ --------------
  
- .. class:: Timer(stmt='pass', setup='pass', timer=<timer function>)
+ The following example shows how the :ref:`command-line-interface`
+ can be used to compare three different expressions:
  
-    Class for timing execution speed of small code snippets.
+ .. code-block:: sh
  
-    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 ``;`` or newlines, as long as
-    they don't contain multi-line string literals.
+    $ python -m timeit '"-".join(str(n) for n in range(100))'
+    10000 loops, best of 3: 40.3 usec per loop
+    $ python -m timeit '"-".join([str(n) for n in range(100)])'
+    10000 loops, best of 3: 33.4 usec per loop
+    $ python -m timeit '"-".join(map(str, range(100)))'
+    10000 loops, best of 3: 25.2 usec per loop
  
-    To measure the execution time of the first statement, use the :meth:`Timer.timeit`
-    method.  The :meth:`repeat` method is a convenience to call :meth:`.timeit`
-    multiple times and return a list of results.
+ This can be achieved from the :ref:`python-interface` with::
+    >>> import timeit
+    >>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
+    0.8187260627746582
+    >>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000)
+    0.7288308143615723
+    >>> timeit.timeit('"-".join(map(str, range(100)))', number=10000)
+    0.5858950614929199
+ 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.
  
-    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.
  
+ .. _python-interface:
  
- .. method:: Timer.print_exc(file=None)
+ Python Interface
+ ----------------
  
-    Helper to print a traceback from the timed code.
+ The module defines three convenience functions and a public class:
+ .. function:: timeit(stmt='pass', setup='pass', timer=<default timer>, number=1000000)
  
-    Typical use::
+    Create a :class:`Timer` instance with the given statement, *setup* code and
+    *timer* function and run its :meth:`.timeit` method with *number* executions.
  
-       t = Timer(...)       # outside the try/except
-       try:
-           t.timeit(...)    # or t.repeat(...)
-       except:
-           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 ``sys.stderr``.
+ .. function:: repeat(stmt='pass', setup='pass', timer=<default timer>, repeat=3, number=1000000)
  
+    Create a :class:`Timer` instance with the given statement, *setup* code and
+    *timer* function and run its :meth:`.repeat` method with the given *repeat*
+    count and *number* executions.
  
- .. method:: Timer.repeat(repeat=3, number=1000000)
  
-    Call :meth:`.timeit` a few times.
+ .. function:: default_timer()
  
-    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`.
 -   Define a default timer, in a platform-specific manner. On Windows,
 -   :func:`time.clock` has microsecond granularity, but :func:`time.time`'s
 -   granularity is 1/60th of a second.  On Unix, :func:`time.clock` has 1/100th of
 -   a second granularity, and :func:`time.time` is much more precise.  On either
 -   platform, :func:`default_timer` measures wall clock time, not the CPU
 -   time.  This means that other processes running on the same computer may
 -   interfere with the timing.
++   The default timer, which is always :func:`time.perf_counter`.
 +
-    .. note::
++   .. versionchanged:: 3.3
++      :func:`time.perf_counter` is now the default timer.
  
-       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.
  
+ .. class:: Timer(stmt='pass', setup='pass', timer=<timer function>)
  
- .. method:: Timer.timeit(number=1000000)
+    Class for timing execution speed of small code snippets.
  
-    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.
+    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 ``;``
+    or newlines, as long as they don't contain multi-line string literals.
  
-    .. note::
+    To measure the execution time of the first statement, use the :meth:`.timeit`
+    method.  The :meth:`.repeat` method is a convenience to call :meth:`.timeit`
+    multiple times and return a list of results.
  
-       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::
+    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.
  
-          timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit()
  
+    .. method:: Timer.timeit(number=1000000)
  
- The module also defines three convenience functions:
+       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.
  
+       .. note::
  
- .. function:: default_timer()
+          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::
  
-    The default timer, which is always :func:`time.perf_counter`.
+             timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit()
  
  
.. function:: repeat(stmt='pass', setup='pass', timer=<default timer>, repeat=3, number=1000000)
   .. method:: Timer.repeat(repeat=3, number=1000000)
  
-    Create a :class:`Timer` instance with the given statement, setup code and timer
-    function and run its :meth:`repeat` method with the given repeat count and
-    *number* executions.
+       Call :meth:`.timeit` a few times.
  
+       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`.
  
- .. function:: timeit(stmt='pass', setup='pass', timer=<default timer>, number=1000000)
+       .. note::
  
-    Create a :class:`Timer` instance with the given statement, setup code and timer
-    function and run its :meth:`.timeit` method with *number* executions.
+          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.
  
  
- Command Line Interface
+    .. 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(...)
+          except:
+              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`.
+ .. _command-line-interface:
+ Command-Line Interface
  ----------------------
  
  When called as a program from the command line, the following form is used::
diff --cc Misc/NEWS
index 83d6b00c311fee3859bf5bb5062178635e0edbbd,a676f3eccf190c5ed2cec07675e7a41395f09db5..8dae861121c456319db96120af0548349a402b0f
+++ b/Misc/NEWS
@@@ -98,35 -3401,24 +98,37 @@@ Test
  Build
  -----
  
 -- Issue #10268: Add a --enable-loadable-sqlite-extensions option to configure.
 +- Issue #15923: Fix a mistake in ``asdl_c.py`` that resulted in a TypeError
 +  after 2801bf875a24 (see #15801).
 +
 +- Issue #15819: Make sure we can build Python out-of-tree from a readonly source
 +  directory.  (Somewhat related to issue #9860.)
  
 -- Issue #8852: Allow the socket module to build on OpenSolaris.
 +Documentation
 +-------------
 +
 +- Issue #15533: Clarify docs and add tests for `subprocess.Popen()`'s cwd
 +  argument.
  
 -- Drop -OPT:Olimit compiler option.
++- Issue #15979: Improve timeit documentation.
++
 +- Issue #16036: Improve documentation of built-in `int()`'s signature and
 +  arguments.
  
 -- Issue #10094: Use versioned .so files on GNU/kfreeBSD and the GNU Hurd.
 +- Issue #15935: Clarification of `argparse` docs, re: add_argument() type and
 +  default arguments.  Patch contributed by Chris Jerdonek.
  
 -- Accept Oracle Berkeley DB 5.0 and 5.1 as backend for the dbm extension.
 +- Issue #11964: Document a change in v3.2 to the behavior of the indent
 +  parameter of json encoding operations.
  
 -- Issue #7473: avoid link errors when building a framework with a different set
 -  of architectures than the one that is currently installed.
 +Tools/Demos
 +-----------
  
  
 -What's New in Python 3.2 Alpha 3?
 -=================================
 +What's New in Python 3.3.0?
 +===========================
  
 -*Release date: 09-Oct-2010*
 +*Release date: 29-Sep-2012*
  
  Core and Builtins
  -----------------