profile.doc                     last updated 6/23/94 [by Guido]

 PROFILER DOCUMENTATION and (mini) USER'S MANUAL

Copyright 1994, by InfoSeek Corporation, all rights reserved.
Written by James Roskind

Permission to use, copy, modify, and distribute this Python software
and its associated documentation for any purpose (subject to the
restriction in the following sentence) without fee is hereby granted,
provided that the above copyright notice appears in all copies, and
that both that copyright notice and this permission notice appear in
supporting documentation, and that the name of InfoSeek not be used in
advertising or publicity pertaining to distribution of the software
without specific, written prior permission.  This permission is
explicitly restricted to the copying and modification of the software
to remain in Python, compiled Python, or other languages (such as C)
wherein the modified or derived code is exclusively imported into a
Python module.

INFOSEEK CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS. IN NO EVENT SHALL INFOSEEK CORPORATION BE LIABLE FOR ANY
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.


The profiler was written after only programming in Python for 3 weeks.
As a result, it is probably clumsy code, but I don't know for sure yet
'cause I'm a beginner :-).  I did work hard to make the code run fast,
so that profiling would be a reasonable thing to do.  I tried not to
repeat code fragments, but I'm sure I did some stuff in really awkward
ways at times.  Please send suggestions for improvements to:
jar@infoseek.com.  I won't promise *any* support.  ...but I'd
appreciate the feedback.


SECTION HEADING LIST:
  INTRODUCTION
  HOW IS THIS profile DIFFERENT FROM THE OLD profile MODULE?
  INSTANT USERS MANUAL
  WHAT IS DETERMINISTIC PROFILING?
  REFERENCE MANUAL			  
    FUNCTION	profile.run(string, filename_opt)
    CLASS	Stats(filename, ...)
    METHOD	strip_dirs()
    METHOD	add(filename, ...)
    METHOD	sort_stats(key, ...)
    METHOD	reverse_order()
    METHOD	print_stats(restriction, ...)
    METHOD	print_callers(restrictions, ...)
    METHOD	print_callees(restrictions, ...)
    METHOD	ignore()
  LIMITATIONS
  CALIBRATION
  EXTENSIONS: Deriving Better Profilers



INTRODUCTION

A "profiler" is a program that describes the run time performance of a
program, providing a variety of statistics.  This documentation
describes the profiler functionality provided in the modules
"profile" and "pstats."  This profiler provides "deterministic
profiling" of any Python programs.  It also provides a series of
report generation tools to allow users to rapidly examine the results
of a profile operation.


HOW IS THIS profile DIFFERENT FROM THE OLD profile MODULE?

The big changes from standard profiling module are that you get more
information, and you pay less CPU time.  It's not a trade-off, it's a
trade-up.

To be specific:

 bugs removed: local stack frame is no longer molested, execution time
      is now charged to correct functions, ....

 accuracy increased: profiler execution time is no longer charged to
      user's code, calibration for platform is supported, file reads
      are not done *by* profiler *during* profiling (and charged to
      user's code!), ...

 speed increased: Overhead CPU cost was reduced by more than a factor of
      two (perhaps a factor of five), lightweight profiler module is
      all that must be loaded, and the report generating module
      (pstats) is not needed during profiling. 

 recursive functions support: cumulative times in recursive functions
      are correctly calculated; recursive entries are counted; ...

 large growth in report generating UI: distinct profiles runs can be added
       together forming a comprehensive report; functions that import
       statistics take arbitrary lists of files; sorting criteria is now
       based on keywords (instead of 4 integer options); reports shows
       what functions were profiled as well as what profile file was
       referenced; output format has been improved, ...


INSTANT USERS MANUAL

This section is provided for users that "don't want to read the
manual." It provides a very brief overview, and allows a user to
rapidly perform profiling on an existing application.

To profile an application with a main entry point of "foo()", you
would add the following to your module:

	import profile
	profile.run("foo()")

The above action would cause "foo()" to be run, and a series of
informative lines (the profile) to be printed.  The above approach is
most useful when working with the interpreter.  If you would like to
save the results of a profile into a file for later examination, you
can supply a file name as the second argument to the run() function:

	import profile
	profile.run("foo()", 'fooprof')

When you wish to review the profile, you should use the methods in the
pstats module.  Typically you would load the statistics data as
follows:

	import pstats
	p = pstats.Stats('fooprof')

The class "Stats" (the above code just created an instance of this
class) has a variety of methods for manipulating and printing the data
that was just read into "p".  When you ran profile.run() above, what
was printed was the result of three method calls:

	p.strip_dirs().sort_stats(-1).print_stats()

The first method removed the extraneous path from all the module
names. The second method sorted all the entries according to the
standard module/line/name string that is printed (this is to comply
with the semantics of the old profiler).  The third method printed out
all the statistics.  You might try the following sort calls:

	p.sort_stats('name')
	p.print_stats()

The first call will actually sort the list by function name, and the
second call will print out the statistics.  The following are some
interesting calls to experiment with:

	p.sort_stats('cumulative').print_stats(10)

This sorts the profile by cumulative time in a function, and then only
prints the ten most significant lines.  If you want to understand what
algorithms are taking time, the above line is what you would use.

If you were looking to see what functions were looping a lot, and
taking a lot of time, you would do:

	p.sort_stats('time').print_stats(10)

to sort according to time spent within each function, and then print
the statistics for the top ten functions.

You might also try:

	p.sort_stats('file').print_stats('__init__')

This will sort all the statistics by file name, and then print out
statistics for only the class init methods ('cause they are spelled
with "__init__" in them).  As one final example, you could try:

	p.sort_stats('time', 'cum').print_stats(.5, 'init')

This line sorts stats with a primary key of time, and a secondary key
of cumulative time, and then prints out some of the statistics.  To be
specific, the list is first culled down to 50% (re: .5) of its
original size, then only lines containing "init" are maintained, and
that sub-sub-list is printed.

If you wondered what functions called the above functions, you could
now (p is still sorted according to the last criteria) do:

	p.print_callers(.5, 'init')

and you would get a list of callers for each of the listed functions. 

If you want more functionality, you're going to have to read the
manual (or guess) what the following functions do:

	p.print_callees()
	p.add('fooprof')


WHAT IS DETERMINISTIC PROFILING?

"Deterministic profiling" is meant to reflect the fact that all
"function call", "function return", and "exception" events are
monitored, and precise timings are made for the intervals between
these events (during which time the user's code is executing).  In
contrast, "statistical profiling" (which is not done by this module)
randomly samples the effective instruction pointer, and deduces where
time is being spent.  The latter technique traditionally involves less
overhead (as the code does not need to be instrumented), but provides
only relative indications of where time is being spent.

In Python, since there is an interpreter active during execution, the
presence of instrumented code is not required to do deterministic
profiling. Python automatically provides a hook (optional callback)
for each event.  In addition, the interpreted nature of Python tends
to add so much overhead to execution, that deterministic profiling
tends to only add small processing overhead, in typical applications.
The result is that deterministic profiling is not that expensive, but
yet provides extensive run time statistics about the execution of a
Python program.  

Call count statistics can be used to identify bugs in code (surprising
counts), and to identify possible inline-expansion points (high call
counts).  Internal time statistics can be used to identify hot loops
that should be carefully optimized.  Cumulative time statistics should
be used to identify high level errors in the selection of algorithms.
Note that the unusual handling of cumulative times in this profiler
allows statistics for recursive implementations of algorithms to be
directly compared to iterative implementations.


REFERENCE MANUAL			  

The primary entry point for the profiler is the global function
profile.run().  It is typically used to create any profile
information.  The reports are formatted and printed using methods for
the class pstats.Stats.  The following is a description of all of
these standard entry points and functions.  For a more in-depth view
of some of the code, consider reading the later section on "Profiler
Extensions," which includes discussion of how to derive "better"
profilers from the classes presented, or reading the source code for
these modules.


FUNCTION	profile.run(string, filename_opt)

This function takes a single argument that has can be passed to the
"exec" statement, and an optional file name.  In all cases this
routine attempts to "exec" its first argument, and gather profiling
statistics from the execution. If no file name is present, then this
function automatically prints a simple profiling report, sorted by the
standard name string (file/line/function-name) that is presented in
each line.  The following is a typical output from such a call:

cut here----

         main()
         2706 function calls (2004 primitive calls) in 4.504 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        2    0.006    0.003    0.953    0.477 pobject.py:75(save_objects)
     43/3    0.533    0.012    0.749    0.250 pobject.py:99(evaluate)
	...

cut here----

The first line indicates that this profile was generated by the call:
profile.run('main()'), and hence the exec'ed string is 'main()'.  The
second line indicates that 2706 calls were monitored.  Of those calls,
2004 were "primitive."  We define "primitive" to mean that the call
was not induced via recursion.  The next line: "Ordered by: standard
name", indicates that the text string in the far right column was used
to sort the output.  The column headings include:

	"ncalls" for the number of calls, 
	"tottime" for the total time spent in the given function
		(and excluding time made in calls to sub-functions), 
	"percall" is the quotient of "tottime" divided by "ncalls"
	"cumtime" is the total time spent in this and all subfunctions
		(i.e., from invocation till exit). This figure is
		accurate *even* for recursive functions.
	"percall" is the quotient of "cumtime" divided by primitive
		calls
	"filename:lineno(function)" provides the respective data of
		each function

When there are two numbers in the first column (e.g.: 43/3), then the
latter is the number of primitive calls, and the former is the actual
number of calls.  Note that when the function does not recurse, these
two values are the same, and only the single figure is printed.


CLASS	Stats(filename, ...)

This class constructor creates an instance of a statistics object from
a filename (or set of filenames).  Stats objects are manipulated by
methods, in order to print useful reports.  

The file selected by the above constructor must have been created by
the corresponding version of profile.  To be specific, there is *NO*
file compatibility guaranteed with future versions of this profiler,
and there is no compatibility with files produced by other profilers
(e.g., the standard system profiler).

If several files are provided, all the statistics for identical
functions will be coalesced, so that an overall view of several
processes can be considered in a single report.  If additional files
need to be combined with data in an existing Stats object, the add()
method can be used.


METHOD	strip_dirs()

This method for the Stats class removes all leading path information
from file names.  It is very useful in reducing the size of the
printout to fit within (close to) 80 columns.  This method modifies
the object, and the striped information is lost.  After performing a
strip operation, the object is considered to have its entries in a
"random" order, as it was just after object initialization and
loading.  If strip_dir() causes two function names to be
indistinguishable (i.e., they are on the same line of the same
filename, and have the same function name), then the statistics for
these two entries are accumulated into a single entry.


METHOD	add(filename, ...)

This methods of the Stats class accumulates additional profiling
information into the current profiling object.  Its arguments should
refer to filenames created my the corresponding version of
profile.run().  Statistics for identically named (re: file, line,
name) functions are automatically accumulated into single function
statistics.


METHOD	sort_stats(key, ...)

This method modifies the Stats object by sorting it according to the
supplied criteria.  The argument is typically a string identifying the
basis of a sort (example: "time" or "name").

When more than one key is provided, then additional keys are used as
secondary criteria when the there is equality in all keys selected
before them.  For example, sort_stats('name', 'file') will sort all
the entries according to their function name, and resolve all ties
(identical function names) by sorting by file name.

Abbreviations can be used for any key names, as long as the
abbreviation is unambiguous.  The following are the keys currently
defined: 

		Valid Arg       Meaning
		  "calls"      call count
		  "cumulative" cumulative time
		  "file"       file name
		  "module"     file name
		  "pcalls"     primitive call count
		  "line"       line number
		  "name"       function name
		  "nfl"        name/file/line
		  "stdname"    standard name
		  "time"       internal time

Note that all sorts on statistics are in descending order (placing most
time consuming items first), where as name, file, and line number
searches are in ascending order (i.e., alphabetical). The subtle
distinction between "nfl" and "stdname" is that the standard name is a
sort of the name as printed, which means that the embedded line
numbers get compared in an odd way.  For example, lines 3, 20, and 40
would (if the file names were the same) appear in the string order
"20" "3" and "40".  In contrast, "nfl" does a numeric compare of the
line numbers.  In fact, sort_stats("nfl") is the same as
sort_stats("name", "file", "line").

For compatibility with the standard profiler, the numeric argument -1,
0, 1, and 2 are permitted.  They are interpreted as "stdname",
"calls", "time", and "cumulative" respectively.  If this old style
format (numeric) is used, only one sort key (the numeric key) will be
used, and additionally arguments will be silently ignored.


METHOD	reverse_order()

This method for the Stats class reverses the ordering of the basic
list within the object.  This method is provided primarily for
compatibility with the standard profiler.  Its utility is questionable
now that ascending vs descending order is properly selected based on
the sort key of choice.


METHOD	print_stats(restriction, ...)

This method for the Stats class prints out a report as described in
the profile.run() definition.  

The order of the printing is based on the last sort_stats() operation
done on the object (subject to caveats in add() and strip_dirs()).

The arguments provided (if any) can be used to limit the list down to
the significant entries.  Initially, the list is taken to be the
complete set of profiled functions.  Each restriction is either an
integer (to select a count of lines), or a decimal fraction between
0.0 and 1.0 inclusive (to select a percentage of lines), or a regular
expression (to pattern match the standard name that is printed).  If
several restrictions are provided, then they are applied sequentially.
For example:

	print_stats(.1, "foo:")

would first limit the printing to first 10% of list, and then only 
print functions that were part of filename ".*foo:".  In contrast, the
command: 

	print_stats("foo:", .1)

would limit the list to all functions having file names ".*foo:", and
then proceed to only print the first 10% of them.


METHOD	print_callers(restrictions, ...)

This method for the Stats class prints a list of all functions that
called each function in the profiled database.  The ordering is
identical to that provided by print_stats(), and the definition of the
restricting argument is also identical.  For convenience, a number is
shown in parentheses after each caller to show how many times this
specific call was made.  A second non-parenthesized number is the
cumulative time spent in the function at the right.


METHOD	print_callees(restrictions, ...)

This method for the Stats class prints a list of all function that
were called by the indicated function.  Aside from this reversal of
direction of calls (re: called vs was called by), the arguments and
ordering are identical to the print_callers() method.


METHOD	ignore()

This method of the Stats class is used to dispose of the value
returned by earlier methods.  All standard methods in this class
return the instance that is being processed, so that the commands can
be strung together.  For example:

pstats.Stats('foofile').strip_dirs().sort_stats('cum').print_stats().ignore()

would perform all the indicated functions, but it would not return
the final reference to the Stats instance.



	
LIMITATIONS

There are two fundamental limitations on this profiler.  The first is
that it relies on the Python interpreter to dispatch "call", "return",
and "exception" events.  Compiled C code does not get interpreted,
and hence is "invisible" to the profiler.  All time spent in C code
(including builtin functions) will be charged to the Python function
that was invoked the C code.  IF the C code calls out to some native
Python code, then those calls will be profiled properly.

The second limitation has to do with accuracy of timing information.
There is a fundamental problem with deterministic profilers involving
accuracy.  The most obvious restriction is that the underlying "clock"
is only ticking at a rate (typically) of about .001 seconds.  Hence no
measurements will be more accurate that that underlying clock.  If
enough measurements are taken, then the "error" will tend to average
out. Unfortunately, removing this first error induces a second source
of error...

The second problem is that it "takes a while" from when an event is
dispatched until the profiler's call to get the time actually *gets*
the state of the clock.  Similarly, there is a certain lag when
exiting the profiler event handler from the time that the clock's
value was obtained (and then squirreled away), until the user's code
is once again executing.  As a result, functions that are called many
times, or call many functions, will typically accumulate this error.
The error that accumulates in this fashion is typically less than the
accuracy of the clock (i.e., less than one clock tick), but it *can*
accumulate and become very significant.  This profiler provides a
means of calibrating itself for a give platform so that this error can
be probabilistically (i.e., on the average) removed.  After the
profiler is calibrated, it will be more accurate (in a least square
sense), but it will sometimes produce negative numbers (when call
counts are exceptionally low, and the gods of probability work against
you :-). )  Do *NOT* be alarmed by negative numbers in the profile.
They should *only* appear if you have calibrated your profiler, and
the results are actually better than without calibration.


CALIBRATION

The profiler class has a hard coded constant that is added to each
event handling time to compensate for the overhead of calling the time
function, and socking away the results.  The following procedure can
be used to obtain this constant for a given platform (see discussion
in LIMITATIONS above). 

	import profile
	pr = profile.Profile()
	pr.calibrate(100)
	pr.calibrate(100)
	pr.calibrate(100)

The argument to calibrate() is the number of times to try to do the
sample calls to get the CPU times.  If your computer is *very* fast,
you might have to do:

	pr.calibrate(1000)

or even:

	pr.calibrate(10000)

The object of this exercise is to get a fairly consistent result.
When you have a consistent answer, you are ready to use that number in
the source code.  For a Sun Sparcstation 1000 running Solaris 2.3, the
magical number is about .00053.  If you have a choice, you are better
off with a smaller constant, and your results will "less often" show
up as negative in profile statistics.

The following shows how the trace_dispatch() method in the Profile
class should be modified to install the calibration constant on a Sun
Sparcstation 1000:

	def trace_dispatch(self, frame, event, arg):
		t = self.timer()
		t = t[0] + t[1] - self.t - .00053 # Calibration constant

		if self.dispatch[event](frame,t):
			t = self.timer()
			self.t = t[0] + t[1]
		else:
			r = self.timer()
			self.t = r[0] + r[1] - t # put back unrecorded delta
		return

Note that if there is no calibration constant, then the line
containing the callibration constant should simply say:

		t = t[0] + t[1] - self.t  # no calibration constant

You can also achieve the same results using a derived class (and the
profiler will actually run equally fast!!), but the above method is
the simplest to use.  I could have made the profiler "self
calibrating", but it would have made the initialization of the
profiler class slower, and would have required some *very* fancy
coding, or else the use of a variable where the constant .00053 was
placed in the code shown.  This is a ****VERY**** critical performance
section, and there is no reason to use a variable lookup at this
point, when a constant can be used.


EXTENSIONS: Deriving Better Profilers

The Profile class of profile was written so that derived classes
could be developed to extend the profiler.  Rather than describing all
the details of such an effort, I'll just present the following two
examples of derived classes that can be used to do profiling.  If the
reader is an avid Python programmer, then it should be possible to use
these as a model and create similar (and perchance better) profile
classes. 

If all you want to do is change how the timer is called, or which
timer function is used, then the basic class has an option for that in
the constructor for the class.  Consider passing the name of a
function to call into the constructor:

	pr = profile.Profile(your_time_func)

The resulting profiler will call your time function instead of
os.times().  The function should return either a single number, or a
list of numbers (like what os.times() returns).  If the function
returns a single time number, or the list of returned numbers has
length 2, then you will get an especially fast version of the dispatch
routine.  

Be warned that you *should* calibrate the profiler class for the
timer function that you choose.  For most machines, a timer that
returns a lone integer value will provide the best results in terms of
low overhead during profiling.  (os.times is *pretty* bad, 'cause it
returns a tuple of floating point values, so all arithmetic is
floating point in the profiler!).  If you want to be substitute a
better timer in the cleanest fashion, you should derive a class, and
simply put in the replacement dispatch method that better handles your timer
call, along with the appropriate calibration constant :-).


cut here------------------------------------------------------------------
#****************************************************************************
# OldProfile class documentation
#****************************************************************************
#
# The following derived profiler simulates the old style profile, providing
# errant results on recursive functions. The reason for the usefulness of this
# profiler is that it runs faster (i.e., less overhead) than the old
# profiler.  It still creates all the caller stats, and is quite
# useful when there is *no* recursion in the user's code.  It is also
# a lot more accurate than the old profiler, as it does not charge all
# its overhead time to the user's code. 
#****************************************************************************
class OldProfile(Profile):
	def trace_dispatch_exception(self, frame, t):
		rt, rtt, rct, rfn, rframe, rcur = self.cur
		if rcur and not rframe is frame:
			return self.trace_dispatch_return(rframe, t)
		return 0

	def trace_dispatch_call(self, frame, t):
		fn = `frame.f_code`
		
		self.cur = (t, 0, 0, fn, frame, self.cur)
		if self.timings.has_key(fn):
			tt, ct, callers = self.timings[fn]
			self.timings[fn] = tt, ct, callers
		else:
			self.timings[fn] = 0, 0, {}
		return 1

	def trace_dispatch_return(self, frame, t):
		rt, rtt, rct, rfn, frame, rcur = self.cur
		rtt = rtt + t
		sft = rtt + rct

		pt, ptt, pct, pfn, pframe, pcur = rcur
		self.cur = pt, ptt+rt, pct+sft, pfn, pframe, pcur

		tt, ct, callers = self.timings[rfn]
		if callers.has_key(pfn):
			callers[pfn] = callers[pfn] + 1
		else:
			callers[pfn] = 1
		self.timings[rfn] = tt+rtt, ct + sft, callers

		return 1


	def snapshot_stats(self):
		self.stats = {}
		for func in self.timings.keys():
			tt, ct, callers = self.timings[func]
			nor_func = self.func_normalize(func)
			nor_callers = {}
			nc = 0
			for func_caller in callers.keys():
				nor_callers[self.func_normalize(func_caller)]=\
					  callers[func_caller]
				nc = nc + callers[func_caller]
			self.stats[nor_func] = nc, nc, tt, ct, nor_callers

		

#****************************************************************************
# HotProfile class documentation
#****************************************************************************
#
# This profiler is the fastest derived profile example.  It does not
# calculate caller-callee relationships, and does not calculate cumulative
# time under a function.  It only calculates time spent in a function, so
# it runs very quickly (re: very low overhead).  In truth, the basic
# profiler is so fast, that is probably not worth the savings to give
# up the data, but this class still provides a nice example.
#****************************************************************************
class HotProfile(Profile):
	def trace_dispatch_exception(self, frame, t):
		rt, rtt, rfn, rframe, rcur = self.cur
		if rcur and not rframe is frame:
			return self.trace_dispatch_return(rframe, t)
		return 0

	def trace_dispatch_call(self, frame, t):
		self.cur = (t, 0, frame, self.cur)
		return 1

	def trace_dispatch_return(self, frame, t):
		rt, rtt, frame, rcur = self.cur

		rfn = `frame.f_code`

		pt, ptt, pframe, pcur = rcur
		self.cur = pt, ptt+rt, pframe, pcur

		if self.timings.has_key(rfn):
			nc, tt = self.timings[rfn]
			self.timings[rfn] = nc + 1, rt + rtt + tt
		else:
			self.timings[rfn] =      1, rt + rtt

		return 1


	def snapshot_stats(self):
		self.stats = {}
		for func in self.timings.keys():
			nc, tt = self.timings[func]
			nor_func = self.func_normalize(func)
			self.stats[nor_func] = nc, nc, tt, 0, {}

		

cut here------------------------------------------------------------------
