From 83938437cb74418ba45d00a99d02c6e095110c60 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Fri, 22 Oct 2010 06:28:01 +0000 Subject: [PATCH] #10166: rewrite self-recursion to iteration in pstats.Stats.add(). Also add a unittest and a stats test file. --- Lib/pstats.py | 50 +++++++++++++++++++++------------------- Lib/test/pstats.pck | Bin 0 -> 66607 bytes Lib/test/test_pstats.py | 19 ++++++++++++--- Misc/NEWS | 2 ++ 4 files changed, 44 insertions(+), 27 deletions(-) create mode 100644 Lib/test/pstats.pck diff --git a/Lib/pstats.py b/Lib/pstats.py index 4bb5cf170648..8744235ad004 100644 --- a/Lib/pstats.py +++ b/Lib/pstats.py @@ -104,7 +104,9 @@ class Stats: print(file=self.stream) def load_stats(self, arg): - if not arg: self.stats = {} + if arg is None: + self.stats = {} + return elif isinstance(arg, str): f = open(arg, 'rb') self.stats = marshal.load(f) @@ -114,13 +116,13 @@ class Stats: arg = time.ctime(file_stats.st_mtime) + " " + arg except: # in case this is not unix pass - self.files = [ arg ] + self.files = [arg] elif hasattr(arg, 'create_stats'): arg.create_stats() self.stats = arg.stats arg.stats = {} if not self.stats: - raise TypeError("Cannot create or construct a %r object from '%r''" + raise TypeError("Cannot create or construct a %r object from %r" % (self.__class__, arg)) return @@ -135,29 +137,29 @@ class Stats: self.max_name_len = len(func_std_string(func)) def add(self, *arg_list): - if not arg_list: return self - if len(arg_list) > 1: self.add(*arg_list[1:]) - other = arg_list[0] - if type(self) != type(other): - other = Stats(other) - self.files += other.files - self.total_calls += other.total_calls - self.prim_calls += other.prim_calls - self.total_tt += other.total_tt - for func in other.top_level: - self.top_level[func] = None - - if self.max_name_len < other.max_name_len: - self.max_name_len = other.max_name_len + if not arg_list: + return self + for item in reversed(arg_list): + if type(self) != type(item): + item = Stats(item) + self.files += item.files + self.total_calls += item.total_calls + self.prim_calls += item.prim_calls + self.total_tt += item.total_tt + for func in item.top_level: + self.top_level[func] = None - self.fcn_list = None + if self.max_name_len < item.max_name_len: + self.max_name_len = item.max_name_len - for func, stat in other.stats.items(): - if func in self.stats: - old_func_stat = self.stats[func] - else: - old_func_stat = (0, 0, 0, 0, {},) - self.stats[func] = add_func_stats(old_func_stat, stat) + self.fcn_list = None + + for func, stat in item.stats.items(): + if func in self.stats: + old_func_stat = self.stats[func] + else: + old_func_stat = (0, 0, 0, 0, {},) + self.stats[func] = add_func_stats(old_func_stat, stat) return self def dump_stats(self, filename): diff --git a/Lib/test/pstats.pck b/Lib/test/pstats.pck new file mode 100644 index 0000000000000000000000000000000000000000..c48ccb73a9fe3ff50aba3704a17e1e08ccc4ce08 GIT binary patch literal 66607 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 YGvrbU8r~tHH4p