mirror of
https://github.com/python/cpython.git
synced 2025-11-13 15:40:05 +00:00
Added a test main to the pstats library that can help you browse profile dumps.
This commit is contained in:
parent
f4e5bd9df5
commit
4f3980d3cb
2 changed files with 131 additions and 0 deletions
|
|
@ -220,6 +220,11 @@ p.print_callees()
|
||||||
p.add('fooprof')
|
p.add('fooprof')
|
||||||
\end{verbatim}
|
\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 \module{cmd}) and
|
||||||
|
interactive help.
|
||||||
|
|
||||||
\section{What Is Deterministic Profiling?}
|
\section{What Is Deterministic Profiling?}
|
||||||
\nodename{Deterministic Profiling}
|
\nodename{Deterministic Profiling}
|
||||||
|
|
||||||
|
|
|
||||||
126
Lib/pstats.py
126
Lib/pstats.py
|
|
@ -524,3 +524,129 @@ def count_calls(callers):
|
||||||
|
|
||||||
def f8(x):
|
def f8(x):
|
||||||
return fpformat.fix(x, 3).rjust(8)
|
return fpformat.fix(x, 3).rjust(8)
|
||||||
|
|
||||||
|
#**************************************************************************
|
||||||
|
# Statistics browser added by ESR, April 2001
|
||||||
|
#**************************************************************************
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
import cmd
|
||||||
|
|
||||||
|
class ProfileBrowser(cmd.Cmd):
|
||||||
|
def __init__(self, profile=None):
|
||||||
|
self.prompt = "% "
|
||||||
|
if profile:
|
||||||
|
self.stats = Stats(profile)
|
||||||
|
else:
|
||||||
|
self.stats = None
|
||||||
|
|
||||||
|
def generic(self, fn, line):
|
||||||
|
args = line.split()
|
||||||
|
processed = []
|
||||||
|
for term in args:
|
||||||
|
try:
|
||||||
|
processed.append(int(term))
|
||||||
|
continue
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
frac = float(term)
|
||||||
|
if frac > 1 or frac < 0:
|
||||||
|
print "Fraction argument mus be in [0, 1]"
|
||||||
|
continue
|
||||||
|
processed.append(frac)
|
||||||
|
continue
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
processed.append(term)
|
||||||
|
if self.stats:
|
||||||
|
apply(getattr(self.stats, fn), processed)
|
||||||
|
else:
|
||||||
|
print "No statistics object is loaded."
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def do_add(self, line):
|
||||||
|
self.stats.add(line)
|
||||||
|
return 0
|
||||||
|
def help_add(self):
|
||||||
|
print "Add profile info from given file to current stastics object."
|
||||||
|
|
||||||
|
def do_callees(self, line):
|
||||||
|
return self.generic('callees', line)
|
||||||
|
def help_callees(self):
|
||||||
|
print "Print callees statistics from the current stat object."
|
||||||
|
|
||||||
|
def do_callers(self, line):
|
||||||
|
return self.generic('callers', line)
|
||||||
|
def help_callers(self):
|
||||||
|
print "Print callers statistics from the current stat object."
|
||||||
|
|
||||||
|
def do_EOF(self, line):
|
||||||
|
print ""
|
||||||
|
return 1
|
||||||
|
def help_EOF(self):
|
||||||
|
print "Leave the profile brower."
|
||||||
|
|
||||||
|
def do_quit(self, line):
|
||||||
|
return 1
|
||||||
|
def help_quit(self):
|
||||||
|
print "Leave the profile brower."
|
||||||
|
|
||||||
|
def do_read(self, line):
|
||||||
|
if line:
|
||||||
|
try:
|
||||||
|
self.stats = Stats(line)
|
||||||
|
except IOError, args:
|
||||||
|
print args[1]
|
||||||
|
return
|
||||||
|
self.prompt = line + "% "
|
||||||
|
elif len(self.prompt > 2):
|
||||||
|
line = self.prompt[-2:]
|
||||||
|
else:
|
||||||
|
print "No statistics object is current -- cannot reload."
|
||||||
|
return 0
|
||||||
|
def help_read(self):
|
||||||
|
print "Read in profile data from a specified file."
|
||||||
|
|
||||||
|
def do_reverse(self, line):
|
||||||
|
self.stats.reverse_order()
|
||||||
|
return 0
|
||||||
|
def help_reverse(self):
|
||||||
|
print "Reverse the sort order of the profiling report."
|
||||||
|
|
||||||
|
def do_sort(self, line):
|
||||||
|
apply(self.stats.sort_stats, line.split())
|
||||||
|
return 0
|
||||||
|
def help_sort(self):
|
||||||
|
print "Sort profile data according to specified keys."
|
||||||
|
|
||||||
|
def do_stats(self, line):
|
||||||
|
return self.generic('print_stats', line)
|
||||||
|
def help_stats(self):
|
||||||
|
print "Print statistics from the current stat object."
|
||||||
|
|
||||||
|
def do_strip(self, line):
|
||||||
|
self.stats.strip_order()
|
||||||
|
return 0
|
||||||
|
def help_strip(self):
|
||||||
|
print "Strip leading path information from filenames in the report."
|
||||||
|
|
||||||
|
def postcmd(self, stop, line):
|
||||||
|
if stop:
|
||||||
|
return stop
|
||||||
|
return None
|
||||||
|
|
||||||
|
import sys
|
||||||
|
print "Welcome to the profile statistics browser."
|
||||||
|
if len(sys.argv) > 1:
|
||||||
|
initprofile = sys.argv[1]
|
||||||
|
else:
|
||||||
|
initprofile = None
|
||||||
|
try:
|
||||||
|
ProfileBrowser(initprofile).cmdloop()
|
||||||
|
print "Goodbye."
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# That's all, folks.
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue