Ce profileur est l'exemple de profileur dérivé le plus rapide . Il ne calcule pas les relations appelant-appelé, et ne calcule pas les temps cumulés sous une fonction. Il calcule seulement le temps passé dans un fonction, aussi il tourne trés vite (c.-à-d. surcharge trés faible). En vérité, le profileur de base est si rapide, qu'il est probablement sans interët de chercher à ne pas calculer des données inutiles, mais cette classe fournit toujours un bel exemple.
class HotProfile(Profile):
def trace_dispatch_exception(self, frame, t):
rt, rtt, rfn, rframe, rcur = self.cur
if rcur and not rframe is frame:
return self.trace_dispatch_return(rframe, t)
return 0
def trace_dispatch_call(self, frame, t):
self.cur = (t, 0, frame, self.cur)
return 1
def trace_dispatch_return(self, frame, t):
rt, rtt, frame, rcur = self.cur
rfn = `frame.f_code`
pt, ptt, pframe, pcur = rcur
self.cur = pt, ptt+rt, pframe, pcur
if self.timings.has_key(rfn):
nc, tt = self.timings[rfn]
self.timings[rfn] = nc + 1, rt + rtt + tt
else:
self.timings[rfn] = 1, rt + rtt
return 1
def snapshot_stats(self):
self.stats = {}
for func in self.timings.keys():
nc, tt = self.timings[func]
nor_func = self.func_normalize(func)
self.stats[nor_func] = nc, nc, tt, 0, {}