##
10.8.2 HotProfile Class

This profiler is the fastest derived profile example. It does not calculate caller-callee relationships, and does not calculate cumulative time under a function. It only calculates time spent in a function, so it runs very quickly (re: very low overhead). In truth, the basic profiler is so fast, that is probably not worth the savings to give up the data, but this class still provides a nice example.

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