def deep_stats(depth=sys.getrecursionlimit(), skip_if_no_recursion_error=True): # Define a function with deep recursion. def x0(frames): frames.append(sys._getframe()) locals_ = locals() for x in range(1, depth): code = dedent(''' import sys def x%d(frames): frames.append(sys._getframe()) x%d(frames) ''' % (x, x - 1)) exec_(code, locals_) f = locals_['x%d' % (depth - 1)] frames = [] try: f(frames) except RuntimeError: # Expected. pass else: # Maybe PyPy. if skip_if_no_recursion_error: pytest.skip('Recursion limit not exceeded') # Profile the deepest frame. profiler = TracingProfiler() profiler._profile(frames[-1], 'call', None) spin(0.5) profiler._profile(frames[-1], 'return', None) # Test with the result. stats, __, __ = profiler.result() return stats
def test_profiler(): profiler = TracingProfiler(top_frames=[sys._getframe()]) assert isinstance(profiler.stats, RecordingStatistics) stats, cpu_time, wall_time = profiler.result() assert len(stats) == 0 with profiler: factorial(1000) factorial(10000) stats1 = find_stats(profiler.stats, 'factorial') stats2 = find_stats(profiler.stats, '__enter__') stats3 = find_stats(profiler.stats, '__exit__') assert stats1.deep_time != 0 assert stats1.deep_time == stats1.own_time assert stats1.own_time > stats2.own_time assert stats1.own_time > stats3.own_time assert stats1.own_hits == 2 assert stats2.own_hits == 0 # entering to __enter__() wasn't profiled. assert stats3.own_hits == 1
def deep_stats(depth=sys.getrecursionlimit(), skip_if_no_recursion_error=True): # Define a function with deep recursion. def x0(frames): frames.append(sys._getframe()) locals_ = locals() for x in range(1, depth): code = dedent( """ import sys def x%d(frames): frames.append(sys._getframe()) x%d(frames) """ % (x, x - 1) ) exec_(code, locals_) f = locals_["x%d" % (depth - 1)] frames = [] try: f(frames) except RuntimeError: # Expected. pass else: # Maybe PyPy. if skip_if_no_recursion_error: pytest.skip("Recursion limit not exceeded") # Profile the deepest frame. profiler = TracingProfiler() profiler._profile(frames[-1], "call", None) spin(0.5) profiler._profile(frames[-1], "return", None) # Test with the result. stats, __, __ = profiler.result() return stats