1 """High-perfomance logging profiler, mostly written in C."""
5 from _hotshot
import ProfilerError
9 def __init__(self
, logfn
, lineevents
=0, linetimings
=1):
10 self
.lineevents
= lineevents
and 1 or 0
11 self
.linetimings
= (linetimings
and lineevents
) and 1 or 0
12 self
._prof
= p
= _hotshot
.profiler(
13 logfn
, self
.lineevents
, self
.linetimings
)
15 # Attempt to avoid confusing results caused by the presence of
16 # Python wrappers around these functions, but only if we can
17 # be sure the methods have not been overridden or extended.
18 if self
.__class
__ is Profile
:
22 self
.addinfo
= p
.addinfo
25 """Close the logfile and terminate the profiler."""
29 """Start the profiler."""
33 """Stop the profiler."""
36 def addinfo(self
, key
, value
):
37 """Add an arbitrary labelled value to the profile log."""
38 self
._prof
.addinfo(key
, value
)
40 # These methods offer the same interface as the profile.Profile class,
41 # but delegate most of the work to the C implementation underneath.
44 """Profile an exec-compatible string in the script
47 The globals from the __main__ module are used as both the
48 globals and locals for the script.
51 dict = __main__
.__dict
__
52 return self
.runctx(cmd
, dict, dict)
54 def runctx(self
, cmd
, globals, locals):
55 """Evaluate an exec-compatible string in a specific
58 The string is compiled before profiling begins.
60 code
= compile(cmd
, "<string>", "exec")
61 self
._prof
.runcode(code
, globals, locals)
64 def runcall(self
, func
, *args
, **kw
):
65 """Profile a single call of a callable.
67 Additional positional and keyword arguments may be passed
68 along; the result of the call is returned, and exceptions are
69 allowed to propogate cleanly, while ensuring that profiling is
70 disabled on the way out.
72 return self
._prof
.runcall(func
, args
, kw
)