[Python-checkins] python/dist/src/Lib timeit.py,1.1,1.2

gvanrossum@users.sourceforge.net gvanrossum@users.sourceforge.net
Wed, 05 Mar 2003 18:32:21 -0800


Update of /cvsroot/python/python/dist/src/Lib
In directory sc8-pr-cvs1:/tmp/cvs-serv12260

Modified Files:
	timeit.py 
Log Message:
Added more documentation.


Index: timeit.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/timeit.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** timeit.py	5 Mar 2003 23:31:58 -0000	1.1
--- timeit.py	6 Mar 2003 02:32:19 -0000	1.2
***************
*** 1,17 ****
! """Framework for timing execution speed of small code snippets.
  
! This avoids a number of common traps for timing frameworks (see also
! Tim Peters' introduction to the timing chapter in the Python
! Cookbook).
  
! (To use this with older versions of Python, the dependency on the
! itertools module is easily removed; instead of itertools.repeat(None,
! count) you can use [None]*count; this is barely slower.)
  
  Command line usage:
!   python timeit.py [-n N] [-r N] [-s S] [-t] [-c] [statement]
  
  Options:
!   -n/--number N: how many times to execute 'statement' (default varies)
    -r/--repeat N: how many times to repeat the timer (default 1)
    -s/--setup S: statements executed once before 'statement' (default 'pass')
--- 1,15 ----
! """Framework for measuring execution time for small code snippets.
  
! This module 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.
  
! Library usage: see the Timer class.
  
  Command line usage:
!     python timeit.py [-n N] [-r N] [-s S] [-t] [-c] [statement]
  
  Options:
!   -n/--number N: how many times to execute 'statement' (default: see below)
    -r/--repeat N: how many times to repeat the timer (default 1)
    -s/--setup S: statements executed once before 'statement' (default 'pass')
***************
*** 19,24 ****
--- 17,43 ----
    -c/--clock: use time.clock() (default on Windows)
    statement: statement to be timed (default 'pass')
+ 
+ A multi-line statement may be given by specifying each line as a
+ separate argument; indented lines are possible by enclosing an
+ argument in quotes and using leading spaces.
+ 
+ If -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.
+ 
+ The difference in default timer function is because on Windows,
+ clock() has microsecond granularity but time()'s granularity is 1/60th
+ of a second; on Unix, clock() has 1/100th of a second granularity and
+ time() is much more precise.  On either platform, the default timer
+ functions measures wall clock time, not the CPU time.  This means that
+ other processes running on the same computer may interfere with the
+ timing.  The best thing to do when accurate timing is necessary is to
+ repeat the timing a few times and use the best time; the -r option is
+ good for this.  On Unix, you can use clock() to measure CPU time.
  """
  
+ # To use this module with older versions of Python, the dependency on
+ # the itertools module is easily removed; in the template, instead of
+ # itertools.repeat(None, count), use [None]*count.  It's barely slower.
+ 
  import sys
  import math
***************
*** 38,41 ****
--- 57,63 ----
      default_timer = time.time
  
+ # Don't change the indentation of the template; the reindent() calls
+ # in Timer.__init__() depend on setup being indented 4 spaces and stmt
+ # being indented 8 spaces.
  template = """
  def inner(number, timer):
***************
*** 50,58 ****
--- 72,96 ----
  
  def reindent(src, indent):
+     """Helper to reindent a multi-line statement."""
      return ("\n" + " "*indent).join(src.split("\n"))
  
  class Timer:
+     """Class for timing execution speed of small code snippets.
+ 
+     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
+     module doc string).
+ 
+     To measure the execution time of the first statement, use the
+     timeit() method.  The repeat() method is a convenience to call
+     timeit() multiple times and return a list of results.
+ 
+     The statements may contain newlines, as long as they don't contain
+     multi-line string literals.
+     """
  
      def __init__(self, stmt="pass", setup="pass", timer=default_timer):
+         """Constructor.  See class doc string."""
          self.timer = timer
          stmt = reindent(stmt, 8)
***************
*** 65,71 ****
--- 103,126 ----
  
      def timeit(self, number=default_number):
+         """Time 'number' executions of the main statement.
+ 
+         To be precise, this executes the setup statement once, and
+         then returns the time it takes to execute the main statement
+         a number of times, as a float measured in seconds.  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.
+         """
          return self.inner(number, self.timer)
  
      def repeat(self, repeat=default_repeat, number=default_number):
+         """Call timer() a few times.
+ 
+         This is a convenience function that calls the timer()
+         repeatedly, returning a list of results.  The first argument
+         specifies how many times to call timer(), defaulting to 10;
+         the second argument specifies the timer argument, defaulting
+         to one million.
+         """
          r = []
          for i in range(repeat):
***************
*** 75,78 ****
--- 130,141 ----
  
  def main(args=None):
+     """Main program, used when run as a script.
+ 
+     The optional argument specifies the command line to be parsed,
+     defaulting to sys.argv[1:].
+ 
+     The return value is an exit code to be passed to sys.exit(); it
+     may be None to indicate success.
+     """
      if args is None:
          args = sys.argv[1:]
***************
*** 119,122 ****
--- 182,186 ----
      else:
          print "time: %.3f usec" % usec
+     return None
  
  if __name__ == "__main__":