commit 483e985e487aadc20818085fc196f1819800ebc6 Author: Robert Collins Date: Mon Jan 19 14:57:35 2015 +1300 Issue #17911: Avoid spurious linecache checks. The traceback module was statting every file once per frame, not once per traceback. diff --git a/Lib/traceback.py b/Lib/traceback.py index 686bd80..321155e 100644 --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -54,6 +54,8 @@ def _extract_tb_or_stack_iter(curr, limit, extractor): if limit is None: limit = getattr(sys, 'tracebacklimit', None) + result = [] + fnames = set() n = 0 while curr is not None and (limit is None or n < limit): f, lineno, next_item = extractor(curr) @@ -61,12 +63,15 @@ def _extract_tb_or_stack_iter(curr, limit, extractor): filename = co.co_filename name = co.co_name - linecache.checkcache(filename) + fnames.add(filename) line = linecache.deferredcache(filename, f.f_globals) - yield Frame(filename, lineno, name) + result.append(Frame(filename, lineno, name)) curr = next_item n += 1 + for filename in fnames: + linecache.checkcache(filename) + return result def _extract_tb_iter(tb, limit): return _extract_tb_or_stack_iter(