Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | """High-perfomance logging profiler, mostly written in C.""" |
2 | ||
3 | import _hotshot | |
4 | ||
5 | from _hotshot import ProfilerError | |
6 | ||
7 | ||
8 | class Profile: | |
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) | |
14 | ||
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: | |
19 | self.close = p.close | |
20 | self.start = p.start | |
21 | self.stop = p.stop | |
22 | self.addinfo = p.addinfo | |
23 | ||
24 | def close(self): | |
25 | """Close the logfile and terminate the profiler.""" | |
26 | self._prof.close() | |
27 | ||
28 | def fileno(self): | |
29 | """Return the file descriptor of the profiler's log file.""" | |
30 | return self._prof.fileno() | |
31 | ||
32 | def start(self): | |
33 | """Start the profiler.""" | |
34 | self._prof.start() | |
35 | ||
36 | def stop(self): | |
37 | """Stop the profiler.""" | |
38 | self._prof.stop() | |
39 | ||
40 | def addinfo(self, key, value): | |
41 | """Add an arbitrary labelled value to the profile log.""" | |
42 | self._prof.addinfo(key, value) | |
43 | ||
44 | # These methods offer the same interface as the profile.Profile class, | |
45 | # but delegate most of the work to the C implementation underneath. | |
46 | ||
47 | def run(self, cmd): | |
48 | """Profile an exec-compatible string in the script | |
49 | environment. | |
50 | ||
51 | The globals from the __main__ module are used as both the | |
52 | globals and locals for the script. | |
53 | """ | |
54 | import __main__ | |
55 | dict = __main__.__dict__ | |
56 | return self.runctx(cmd, dict, dict) | |
57 | ||
58 | def runctx(self, cmd, globals, locals): | |
59 | """Evaluate an exec-compatible string in a specific | |
60 | environment. | |
61 | ||
62 | The string is compiled before profiling begins. | |
63 | """ | |
64 | code = compile(cmd, "<string>", "exec") | |
65 | self._prof.runcode(code, globals, locals) | |
66 | return self | |
67 | ||
68 | def runcall(self, func, *args, **kw): | |
69 | """Profile a single call of a callable. | |
70 | ||
71 | Additional positional and keyword arguments may be passed | |
72 | along; the result of the call is returned, and exceptions are | |
73 | allowed to propogate cleanly, while ensuring that profiling is | |
74 | disabled on the way out. | |
75 | """ | |
76 | return self._prof.runcall(func, args, kw) |