\chapter{The Python Profilers \label{profile}}

\sectionauthor{James Roskind}{}

Copyright \copyright{} 1994, by InfoSeek Corporation, all rights reserved.
\index{InfoSeek Corporation}

Written by James Roskind.\footnote{
  Updated and converted to \LaTeX\ by Guido van Rossum.
  Further updated by Armin Rigo to integrate the documentation for the new
  \module{cProfile} module of Python 2.5.}

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:
\email{jar@netscape.com}.  I won't promise \emph{any} support.  ...but
I'd appreciate the feedback.


\section{Introduction to the profilers}
\nodename{Profiler Introduction}

A \dfn{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
\module{profile} and \module{pstats}.  This profiler provides
\dfn{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.
\index{deterministic profiling}
\index{profiling, deterministic}

The Python standard library provides three different profilers:

\begin{enumerate}
\item \module{profile}, a pure Python module, described in the sequel.
  Copyright \copyright{} 1994, by InfoSeek Corporation.
  \versionchanged[also reports the time spent in calls to built-in
  functions and methods]{2.4}

\item \module{cProfile}, a module written in C, with a reasonable
  overhead that makes it suitable for profiling long-running programs.
  Based on \module{lsprof}, contributed by Brett Rosen and Ted Czotter.
  \versionadded{2.5}

\item \module{hotshot}, a C module focusing on minimizing the overhead
  while profiling, at the expense of long data post-processing times.
  \versionchanged[the results should be more meaningful than in the
  past: the timing core contained a critical bug]{2.5}
\end{enumerate}

The \module{profile} and \module{cProfile} modules export the same
interface, so they are mostly interchangeables; \module{cProfile} has a
much lower overhead but is not so far as well-tested and might not be
available on all systems.  \module{cProfile} is really a compatibility
layer on top of the internal \module{_lsprof} module.  The
\module{hotshot} module is reserved to specialized usages.

%\section{How Is This Profiler Different From The Old Profiler?}
%\nodename{Profiler Changes}
%
%(This section is of historical importance only; the old profiler
%discussed here was last seen in Python 1.1.)
%
%The big changes from old 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:
%
%\begin{description}
%
%\item[Bugs removed:]
%Local stack frame is no longer molested, execution time is now charged
%to correct functions.
%
%\item[Accuracy increased:]
%Profiler execution time is no longer charged to user's code,
%calibration for platform is supported, file reads are not done \emph{by}
%profiler \emph{during} profiling (and charged to user's code!).
%
%\item[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 (\module{pstats}) is not needed
%during profiling.
%
%\item[Recursive functions support:]
%Cumulative times in recursive functions are correctly calculated;
%recursive entries are counted.
%
%\item[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.
%
%\end{description}


\section{Instant User's Manual \label{profile-instant}}

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 \function{foo()},
you would add the following to your module:

\begin{verbatim}
import cProfile
cProfile.run('foo()')
\end{verbatim}

(Use \module{profile} instead of \module{cProfile} if the latter is not
available on your system.)

The above action would cause \function{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 \function{run()}
function:

\begin{verbatim}
import cProfile
cProfile.run('foo()', 'fooprof')
\end{verbatim}

The file \file{cProfile.py} can also be invoked as
a script to profile another script.  For example:

\begin{verbatim}
python -m cProfile myscript.py
\end{verbatim}

\file{cProfile.py} accepts two optional arguments on the command line:

\begin{verbatim}
cProfile.py [-o output_file] [-s sort_order]
\end{verbatim}

\programopt{-s} only applies to standard output (\programopt{-o} is
not supplied).  Look in the \class{Stats} documentation for valid sort
values.

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

\begin{verbatim}
import pstats
p = pstats.Stats('fooprof')
\end{verbatim}

The class \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 \code{p}.  When you ran
\function{cProfile.run()} above, what was printed was the result of three
method calls:

\begin{verbatim}
p.strip_dirs().sort_stats(-1).print_stats()
\end{verbatim}

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:

\begin{verbatim}
p.sort_stats('name')
p.print_stats()
\end{verbatim}

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:

\begin{verbatim}
p.sort_stats('cumulative').print_stats(10)
\end{verbatim}

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:

\begin{verbatim}
p.sort_stats('time').print_stats(10)
\end{verbatim}

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

You might also try:

\begin{verbatim}
p.sort_stats('file').print_stats('__init__')
\end{verbatim}

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

\begin{verbatim}
p.sort_stats('time', 'cum').print_stats(.5, 'init')
\end{verbatim}

This line sorts statistics 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: \samp{.5})
of its original size, then only lines containing \code{init} are
maintained, and that sub-sub-list is printed.

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

\begin{verbatim}
p.print_callers(.5, 'init')
\end{verbatim}

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:

\begin{verbatim}
p.print_callees()
p.add('fooprof')
\end{verbatim}

Invoked as a script, the \module{pstats} module is a statistics
browser for reading and examining profile dumps.  It has a simple
line-oriented interface (implemented using \refmodule{cmd}) and
interactive help.

\section{What Is Deterministic Profiling?}
\nodename{Deterministic Profiling}

\dfn{Deterministic profiling} is meant to reflect the fact that all
\emph{function call}, \emph{function return}, and \emph{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, \dfn{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 \dfn{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, 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.


\section{Reference Manual -- \module{profile} and \module{cProfile}}

\declaremodule{standard}{profile}
\declaremodule{standard}{cProfile}
\modulesynopsis{Python profiler}



The primary entry point for the profiler is the global function
\function{profile.run()} (resp. \function{cProfile.run()}).
It is typically used to create any profile
information.  The reports are formatted and printed using methods of
the class \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.

\begin{funcdesc}{run}{command\optional{, filename}}

This function takes a single argument that has can be passed to the
\keyword{exec} statement, and an optional file name.  In all cases this
routine attempts to \keyword{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:

\begin{verbatim}
      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)
 ...
\end{verbatim}

The first line indicates that 2706 calls were
monitored.  Of those calls, 2004 were \dfn{primitive}.  We define
\dfn{primitive} to mean that the call was not induced via recursion.
The next line: \code{Ordered by:\ standard name}, indicates that
the text string in the far right column was used to sort the output.
The column headings include:

\begin{description}

\item[ncalls ]
for the number of calls,

\item[tottime ]
for the total time spent in the given function (and excluding time
made in calls to sub-functions),

\item[percall ]
is the quotient of \code{tottime} divided by \code{ncalls}

\item[cumtime ]
is the total time spent in this and all subfunctions (from invocation
till exit). This figure is accurate \emph{even} for recursive
functions.

\item[percall ]
is the quotient of \code{cumtime} divided by primitive calls

\item[filename:lineno(function) ]
provides the respective data of each function

\end{description}

When there are two numbers in the first column (for example,
\samp{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.

\end{funcdesc}

\begin{funcdesc}{runctx}{command, globals, locals\optional{, filename}}
This function is similar to \function{run()}, with added
arguments to supply the globals and locals dictionaries for the
\var{command} string.
\end{funcdesc}

Analysis of the profiler data is done using the \class{Stats} class.

\note{The \class{Stats} class is defined in the \module{pstats} module.}

% now switch modules....
% (This \stmodindex use may be hard to change ;-( )
\stmodindex{pstats}

\begin{classdesc}{Stats}{filename\optional{, stream=sys.stdout\optional{, \moreargs}}}
This class constructor creates an instance of a ``statistics object''
from a \var{filename} (or set of filenames).  \class{Stats} objects are
manipulated by methods, in order to print useful reports.  You may specify
an alternate output stream by giving the keyword argument, \code{stream}.

The file selected by the above constructor must have been created by the
corresponding version of \module{profile} or \module{cProfile}.  To be
specific, there is \emph{no} file compatibility guaranteed with future
versions of this profiler, and there is no compatibility with files produced
by other profilers.
%(such as the old 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 \class{Stats} object, the
\method{add()} method can be used.

\versionchanged[The \var{stream} parameter was added]{2.5}
\end{classdesc}


\subsection{The \class{Stats} Class \label{profile-stats}}

\class{Stats} objects have the following methods:

\begin{methoddesc}[Stats]{strip_dirs}{}
This method for the \class{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 stripped 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 \method{strip_dirs()} causes two
function names to be indistinguishable (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.
\end{methoddesc}


\begin{methoddesc}[Stats]{add}{filename\optional{, \moreargs}}
This method of the \class{Stats} class accumulates additional
profiling information into the current profiling object.  Its
arguments should refer to filenames created by the corresponding
version of \function{profile.run()} or \function{cProfile.run()}.
Statistics for identically named
(re: file, line, name) functions are automatically accumulated into
single function statistics.
\end{methoddesc}

\begin{methoddesc}[Stats]{dump_stats}{filename}
Save the data loaded into the \class{Stats} object to a file named
\var{filename}.  The file is created if it does not exist, and is
overwritten if it already exists.  This is equivalent to the method of
the same name on the \class{profile.Profile} and
\class{cProfile.Profile} classes.
\versionadded{2.3}
\end{methoddesc}

\begin{methoddesc}[Stats]{sort_stats}{key\optional{, \moreargs}}
This method modifies the \class{Stats} object by sorting it according
to the supplied criteria.  The argument is typically a string
identifying the basis of a sort (example: \code{'time'} or
\code{'name'}).

When more than one key is provided, then additional keys are used as
secondary criteria when there is equality in all keys selected
before them.  For example, \code{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:

\begin{tableii}{l|l}{code}{Valid Arg}{Meaning}
  \lineii{'calls'}{call count}
  \lineii{'cumulative'}{cumulative time}
  \lineii{'file'}{file name}
  \lineii{'module'}{file name}
  \lineii{'pcalls'}{primitive call count}
  \lineii{'line'}{line number}
  \lineii{'name'}{function name}
  \lineii{'nfl'}{name/file/line}
  \lineii{'stdname'}{standard name}
  \lineii{'time'}{internal time}
\end{tableii}

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 (alphabetical). The subtle
distinction between \code{'nfl'} and \code{'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, \code{'nfl'} does a numeric
compare of the line numbers.  In fact, \code{sort_stats('nfl')} is the
same as \code{sort_stats('name', 'file', 'line')}.

%For compatibility with the old profiler,
For backward-compatibility reasons, the numeric arguments
\code{-1}, \code{0}, \code{1}, and \code{2} are permitted.  They are
interpreted as \code{'stdname'}, \code{'calls'}, \code{'time'}, and
\code{'cumulative'} respectively.  If this old style format (numeric)
is used, only one sort key (the numeric key) will be used, and
additional arguments will be silently ignored.
\end{methoddesc}


\begin{methoddesc}[Stats]{reverse_order}{}
This method for the \class{Stats} class reverses the ordering of the basic
list within the object.  %This method is provided primarily for
%compatibility with the old profiler.
Note that by default ascending vs descending order is properly selected
based on the sort key of choice.
\end{methoddesc}

\begin{methoddesc}[Stats]{print_stats}{\optional{restriction, \moreargs}}
This method for the \class{Stats} class prints out a report as described
in the \function{profile.run()} definition.

The order of the printing is based on the last \method{sort_stats()}
operation done on the object (subject to caveats in \method{add()} and
\method{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; as of
Python 1.5b1, this uses the Perl-style regular expression syntax
defined by the \refmodule{re} module).  If several restrictions are
provided, then they are applied sequentially.  For example:

\begin{verbatim}
print_stats(.1, 'foo:')
\end{verbatim}

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

\begin{verbatim}
print_stats('foo:', .1)
\end{verbatim}

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


\begin{methoddesc}[Stats]{print_callers}{\optional{restriction, \moreargs}}
This method for the \class{Stats} class prints a list of all functions
that called each function in the profiled database.  The ordering is
identical to that provided by \method{print_stats()}, and the definition
of the restricting argument is also identical.  Each caller is reported on
its own line.  The format differs slightly depending on the profiler that
produced the stats:

\begin{itemize}
\item With \module{profile}, a number is shown in parentheses after each
  caller to show how many times this specific call was made.  For
  convenience, a second non-parenthesized number repeats the cumulative
  time spent in the function at the right.

\item With \module{cProfile}, each caller is preceeded by three numbers:
  the number of times this specific call was made, and the total and
  cumulative times spent in the current function while it was invoked by
  this specific caller.
\end{itemize}
\end{methoddesc}

\begin{methoddesc}[Stats]{print_callees}{\optional{restriction, \moreargs}}
This method for the \class{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 \method{print_callers()} method.
\end{methoddesc}


\section{Limitations \label{profile-limits}}

One 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 than the 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
\emph{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 (less than one clock tick), but it
\emph{can} accumulate and become very significant.

The problem is more important with \module{profile} than with the
lower-overhead \module{cProfile}.  For this reason, \module{profile}
provides a means of calibrating itself for a given platform so that
this error can be probabilistically (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 \emph{not} be alarmed by negative numbers in
the profile.  They should \emph{only} appear if you have calibrated
your profiler, and the results are actually better than without
calibration.


\section{Calibration \label{profile-calibration}}

The profiler of the \module{profile} module subtracts a constant from each
event handling time to compensate for the overhead of calling the time
function, and socking away the results.  By default, the constant is 0.
The following procedure can
be used to obtain a better constant for a given platform (see discussion
in section Limitations above).

\begin{verbatim}
import profile
pr = profile.Profile()
for i in range(5):
    print pr.calibrate(10000)
\end{verbatim}

The method executes the number of Python calls given by the argument,
directly and again under the profiler, measuring the time for both.
It then computes the hidden overhead per profiler event, and returns
that as a float.  For example, on an 800 MHz Pentium running
Windows 2000, and using Python's time.clock() as the timer,
the magical number is about 12.5e-6.

The object of this exercise is to get a fairly consistent result.
If your computer is \emph{very} fast, or your timer function has poor
resolution, you might have to pass 100000, or even 1000000, to get
consistent results.

When you have a consistent answer,
there are three ways you can use it:\footnote{Prior to Python 2.2, it
  was necessary to edit the profiler source code to embed the bias as
  a literal number.  You still can, but that method is no longer
  described, because no longer needed.}

\begin{verbatim}
import profile

# 1. Apply computed bias to all Profile instances created hereafter.
profile.Profile.bias = your_computed_bias

# 2. Apply computed bias to a specific Profile instance.
pr = profile.Profile()
pr.bias = your_computed_bias

# 3. Specify computed bias in instance constructor.
pr = profile.Profile(bias=your_computed_bias)
\end{verbatim}

If you have a choice, you are better off choosing a smaller constant, and
then your results will ``less often'' show up as negative in profile
statistics.


\section{Extensions --- Deriving Better Profilers}
\nodename{Profiler Extensions}

The \class{Profile} class of both modules, \module{profile} and
\module{cProfile}, were written so that
derived classes could be developed to extend the profiler.  The details
are not described here, as doing this successfully requires an expert
understanding of how the \class{Profile} class works internally.  Study
the source code of the module carefully if you want to
pursue this.

If all you want to do is change how current time is determined (for
example, to force use of wall-clock time or elapsed process time),
pass the timing function you want to the \class{Profile} class
constructor:

\begin{verbatim}
pr = profile.Profile(your_time_func)
\end{verbatim}

The resulting profiler will then call \function{your_time_func()}.

\begin{description}
\item[\class{profile.Profile}]
\function{your_time_func()} should return a single number, or a list of
numbers whose sum is the current time (like what \function{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.  (\function{os.times()} is
\emph{pretty} bad, as it returns a tuple of floating point values).  If
you want to substitute a better timer in the cleanest fashion,
derive a class and hardwire a replacement dispatch method that best
handles your timer call, along with the appropriate calibration
constant.

\item[\class{cProfile.Profile}]
\function{your_time_func()} should return a single number.  If it returns
plain integers, you can also invoke the class constructor with a second
argument specifying the real duration of one unit of time.  For example,
if \function{your_integer_time_func()} returns times measured in thousands
of seconds, you would constuct the \class{Profile} instance as follows:

\begin{verbatim}
pr = profile.Profile(your_integer_time_func, 0.001)
\end{verbatim}

As the \module{cProfile.Profile} class cannot be calibrated, custom
timer functions should be used with care and should be as fast as
possible.  For the best results with a custom timer, it might be
necessary to hard-code it in the C source of the internal
\module{_lsprof} module.

\end{description}
