[Python-checkins] r61084 - in python/trunk: Doc/library/trace.rst Lib/trace.py Misc/NEWS

neal.norwitz python-checkins at python.org
Tue Feb 26 09:21:29 CET 2008


Author: neal.norwitz
Date: Tue Feb 26 09:21:28 2008
New Revision: 61084

Modified:
   python/trunk/Doc/library/trace.rst
   python/trunk/Lib/trace.py
   python/trunk/Misc/NEWS
Log:
Add a timing flag to Trace so you can see where slowness occurs
like waiting for socket timeouts in test_smtplib :-).


Modified: python/trunk/Doc/library/trace.rst
==============================================================================
--- python/trunk/Doc/library/trace.rst	(original)
+++ python/trunk/Doc/library/trace.rst	Tue Feb 26 09:21:28 2008
@@ -80,7 +80,7 @@
 ---------------------
 
 
-.. class:: Trace([count=1[, trace=1[, countfuncs=0[, countcallers=0[, ignoremods=()[, ignoredirs=()[, infile=None[, outfile=None]]]]]]]])
+.. class:: Trace([count=1[, trace=1[, countfuncs=0[, countcallers=0[, ignoremods=()[, ignoredirs=()[, infile=None[, outfile=None[, timing=False]]]]]]]]])
 
    Create an object to trace execution of a single statement or expression. All
    parameters are optional.  *count* enables counting of line numbers. *trace*
@@ -89,7 +89,8 @@
    *ignoremods* is a list of modules or packages to ignore.  *ignoredirs* is a list
    of directories whose modules or packages should be ignored.  *infile* is the
    file from which to read stored count information.  *outfile* is a file in which
-   to write updated count information.
+   to write updated count information. *timing* enables a timestamp relative
+   to when tracing was started to be displayed.
 
 
 .. method:: Trace.run(cmd)

Modified: python/trunk/Lib/trace.py
==============================================================================
--- python/trunk/Lib/trace.py	(original)
+++ python/trunk/Lib/trace.py	Tue Feb 26 09:21:28 2008
@@ -53,6 +53,7 @@
 import re
 import sys
 import threading
+import time
 import token
 import tokenize
 import types
@@ -98,6 +99,8 @@
                       with '>>>>>> '.
 -s, --summary         Write a brief summary on stdout for each file.
                       (Can only be used with --count or --report.)
+-g, --timing          Prefix each line with the time since the program started.
+                      Only used while tracing.
 
 Filters, may be repeated multiple times:
 --ignore-module=<mod> Ignore the given module(s) and its submodules
@@ -435,7 +438,8 @@
 
 class Trace:
     def __init__(self, count=1, trace=1, countfuncs=0, countcallers=0,
-                 ignoremods=(), ignoredirs=(), infile=None, outfile=None):
+                 ignoremods=(), ignoredirs=(), infile=None, outfile=None,
+                 timing=False):
         """
         @param count true iff it should count number of times each
                      line is executed
@@ -451,6 +455,7 @@
         @param infile file from which to read stored counts to be
                      added into the results
         @param outfile file in which to write the results
+        @param timing true iff timing information be displayed
         """
         self.infile = infile
         self.outfile = outfile
@@ -463,6 +468,9 @@
         self._calledfuncs = {}
         self._callers = {}
         self._caller_cache = {}
+        self.start_time = None
+        if timing:
+            self.start_time = time.time()
         if countcallers:
             self.globaltrace = self.globaltrace_trackcallers
         elif countfuncs:
@@ -613,6 +621,8 @@
             key = filename, lineno
             self.counts[key] = self.counts.get(key, 0) + 1
 
+            if self.start_time:
+                print '%.2f' % (time.time() - self.start_time),
             bname = os.path.basename(filename)
             print "%s(%d): %s" % (bname, lineno,
                                   linecache.getline(filename, lineno)),
@@ -624,6 +634,8 @@
             filename = frame.f_code.co_filename
             lineno = frame.f_lineno
 
+            if self.start_time:
+                print '%.2f' % (time.time() - self.start_time),
             bname = os.path.basename(filename)
             print "%s(%d): %s" % (bname, lineno,
                                   linecache.getline(filename, lineno)),
@@ -653,13 +665,13 @@
     if argv is None:
         argv = sys.argv
     try:
-        opts, prog_argv = getopt.getopt(argv[1:], "tcrRf:d:msC:lT",
+        opts, prog_argv = getopt.getopt(argv[1:], "tcrRf:d:msC:lTg",
                                         ["help", "version", "trace", "count",
                                          "report", "no-report", "summary",
                                          "file=", "missing",
                                          "ignore-module=", "ignore-dir=",
                                          "coverdir=", "listfuncs",
-                                         "trackcalls"])
+                                         "trackcalls", "timing"])
 
     except getopt.error, msg:
         sys.stderr.write("%s: %s\n" % (sys.argv[0], msg))
@@ -679,6 +691,7 @@
     summary = 0
     listfuncs = False
     countcallers = False
+    timing = False
 
     for opt, val in opts:
         if opt == "--help":
@@ -697,6 +710,10 @@
             listfuncs = True
             continue
 
+        if opt == "-g" or opt == "--timing":
+            timing = True
+            continue
+
         if opt == "-t" or opt == "--trace":
             trace = 1
             continue
@@ -779,7 +796,7 @@
         t = Trace(count, trace, countfuncs=listfuncs,
                   countcallers=countcallers, ignoremods=ignore_modules,
                   ignoredirs=ignore_dirs, infile=counts_file,
-                  outfile=counts_file)
+                  outfile=counts_file, timing=timing)
         try:
             t.run('execfile(%r)' % (progname,))
         except IOError, err:

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Tue Feb 26 09:21:28 2008
@@ -441,6 +441,8 @@
 Library
 -------
 
+- Add a timing parameter when using trace.Trace to print out timestamps.
+
 - #1627: httplib now ignores negative Content-Length headers.
 
 - #900744: If an invalid chunked-encoding header is sent by a server,


More information about the Python-checkins mailing list