10.8.2 HotProfile Class

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, {}