def _instance_profile_callback(frame, event, arg): """ Collects profile data for functions that match _matches and pass the isinstance check. Elapsed time and number of calls are collected. """ global _call_stack, _inst_data, _matches if event == 'call': if 'self' in frame.f_locals and frame.f_code.co_name in _matches and \ isinstance(frame.f_locals['self'], _matches[frame.f_code.co_name]): _call_stack.append( ("%s#%d#%d" % (frame.f_code.co_filename, frame.f_code.co_firstlineno, id(frame.f_locals['self'])), etime(), frame)) elif event == 'return' and _call_stack: _, start, oldframe = _call_stack[-1] if oldframe is frame: final = etime() path = '|'.join(s[0] for s in _call_stack) if path not in _inst_data: _inst_data[path] = pdata = [frame.f_locals['self'], 0., 0] else: pdata = _inst_data[path] pdata[1] += final - start pdata[2] += 1 _call_stack.pop()
def _instance_profile_callback(frame, event, arg): """ Collects profile data for functions that match _matches and pass the isinstance check. Elapsed time and number of calls are collected. """ global _call_stack, _inst_data, _matches if event == 'call': if 'self' in frame.f_locals and frame.f_code.co_name in _matches and \ isinstance(frame.f_locals['self'], _matches[frame.f_code.co_name]): _call_stack.append(("%s#%d#%d" % (frame.f_code.co_filename, frame.f_code.co_firstlineno, id(frame.f_locals['self'])), etime(), frame)) elif event == 'return' and _call_stack: _, start, oldframe = _call_stack[-1] if oldframe is frame: final = etime() path = '-'.join(s[0] for s in _call_stack) if path not in _inst_data: _inst_data[path] = pdata = [frame.f_locals['self'], 0., 0] else: pdata = _inst_data[path] pdata[1] += final - start pdata[2] += 1 _call_stack.pop()
def stop(): """ Turn off profiling. """ global _profile_total, _profile_start, _call_stack, _inst_data if _profile_start is None: return sys.setprofile(None) _call_stack.pop() _profile_total += (etime() - _profile_start) _inst_data['$total'][1] = _profile_total _inst_data['$total'][2] += 1 _profile_start = None
def start(): """ Turn on profiling. """ global _profile_start, _profile_setup, _call_stack, _inst_data if _profile_start is not None: print("profiling is already active.") return if not _profile_setup: setup() # just do a default setup _profile_start = etime() _call_stack.append(('$total', _profile_start, None)) if '$total' not in _inst_data: _inst_data['$total'] = [None, 0., 0] if sys.getprofile() is not None: raise RuntimeError("another profile function is already active.") sys.setprofile(_instance_profile_callback)