mirror of
https://github.com/python/cpython.git
synced 2025-09-19 15:10:58 +00:00

changing an application to collect profile data on one part of the app while still making use of the profiled component, without relying on side effects.
38 lines
1.1 KiB
Python
38 lines
1.1 KiB
Python
"""High-perfomance logging profiler, mostly written in C."""
|
|
|
|
import _hotshot
|
|
|
|
from _hotshot import ProfilerError
|
|
|
|
|
|
class Profile:
|
|
def __init__(self, logfn, lineevents=0, linetimings=1):
|
|
self.lineevents = lineevents and 1 or 0
|
|
self.linetimings = (linetimings and lineevents) and 1 or 0
|
|
self._prof = p = _hotshot.profiler(
|
|
logfn, self.lineevents, self.linetimings)
|
|
|
|
def close(self):
|
|
self._prof.close()
|
|
|
|
def start(self):
|
|
self._prof.start()
|
|
|
|
def stop(self):
|
|
self._prof.stop()
|
|
|
|
# These methods offer the same interface as the profile.Profile class,
|
|
# but delegate most of the work to the C implementation underneath.
|
|
|
|
def run(self, cmd):
|
|
import __main__
|
|
dict = __main__.__dict__
|
|
return self.runctx(cmd, dict, dict)
|
|
|
|
def runctx(self, cmd, globals, locals):
|
|
code = compile(cmd, "<string>", "exec")
|
|
self._prof.runcode(code, globals, locals)
|
|
return self
|
|
|
|
def runcall(self, func, *args, **kw):
|
|
return self._prof.runcall(func, args, kw)
|