Mercurial > cpython-lru_cache-weakref
annotate Lib/tracemalloc.py @ 87690:66c1c9f32567 default tip
Add use_weakref option to functools.lru_cache
The use_weakref option makes lru_cache create weak references to the function
arguments when creating the cache key, which prevents them from staying in the
memory forever even after all other references to them are gone.
This is a proof of concept for http://bugs.python.org/issue19859
| author | Radomir Dopieralski <devel@sheep.art.pl> |
|---|---|
| date | Tue, 03 Dec 2013 16:02:48 +0100 |
| parents | 9eae3a8181bc |
| children |
| rev | line source |
|---|---|
|
87401
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
1 from collections import Sequence |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
2 from functools import total_ordering |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
3 import fnmatch |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
4 import os.path |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
5 import pickle |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
6 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
7 # Import types and functions implemented in C |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
8 from _tracemalloc import * |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
9 from _tracemalloc import _get_object_traceback, _get_traces |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
10 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
11 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
12 def _format_size(size, sign): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
13 for unit in ('B', 'KiB', 'MiB', 'GiB', 'TiB'): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
14 if abs(size) < 100 and unit != 'B': |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
15 # 3 digits (xx.x UNIT) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
16 if sign: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
17 return "%+.1f %s" % (size, unit) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
18 else: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
19 return "%.1f %s" % (size, unit) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
20 if abs(size) < 10 * 1024 or unit == 'TiB': |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
21 # 4 or 5 digits (xxxx UNIT) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
22 if sign: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
23 return "%+.0f %s" % (size, unit) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
24 else: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
25 return "%.0f %s" % (size, unit) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
26 size /= 1024 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
27 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
28 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
29 class Statistic: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
30 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
31 Statistic difference on memory allocations between two Snapshot instance. |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
32 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
33 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
34 __slots__ = ('traceback', 'size', 'count') |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
35 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
36 def __init__(self, traceback, size, count): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
37 self.traceback = traceback |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
38 self.size = size |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
39 self.count = count |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
40 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
41 def __hash__(self): |
|
87576
9eae3a8181bc
tracemalloc: Fix hash methods of Statistic and StatisticDiff
Victor Stinner <victor.stinner@gmail.com>
parents:
87569
diff
changeset
|
42 return hash((self.traceback, self.size, self.count)) |
|
87401
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
43 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
44 def __eq__(self, other): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
45 return (self.traceback == other.traceback |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
46 and self.size == other.size |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
47 and self.count == other.count) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
48 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
49 def __str__(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
50 text = ("%s: size=%s, count=%i" |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
51 % (self.traceback, |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
52 _format_size(self.size, False), |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
53 self.count)) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
54 if self.count: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
55 average = self.size / self.count |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
56 text += ", average=%s" % _format_size(average, False) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
57 return text |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
58 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
59 def __repr__(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
60 return ('<Statistic traceback=%r size=%i count=%i>' |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
61 % (self.traceback, self.size, self.count)) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
62 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
63 def _sort_key(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
64 return (self.size, self.count, self.traceback) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
65 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
66 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
67 class StatisticDiff: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
68 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
69 Statistic difference on memory allocations between an old and a new |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
70 Snapshot instance. |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
71 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
72 __slots__ = ('traceback', 'size', 'size_diff', 'count', 'count_diff') |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
73 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
74 def __init__(self, traceback, size, size_diff, count, count_diff): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
75 self.traceback = traceback |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
76 self.size = size |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
77 self.size_diff = size_diff |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
78 self.count = count |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
79 self.count_diff = count_diff |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
80 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
81 def __hash__(self): |
|
87576
9eae3a8181bc
tracemalloc: Fix hash methods of Statistic and StatisticDiff
Victor Stinner <victor.stinner@gmail.com>
parents:
87569
diff
changeset
|
82 return hash((self.traceback, self.size, self.size_diff, |
|
9eae3a8181bc
tracemalloc: Fix hash methods of Statistic and StatisticDiff
Victor Stinner <victor.stinner@gmail.com>
parents:
87569
diff
changeset
|
83 self.count, self.count_diff)) |
|
87401
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
84 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
85 def __eq__(self, other): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
86 return (self.traceback == other.traceback |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
87 and self.size == other.size |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
88 and self.size_diff == other.size_diff |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
89 and self.count == other.count |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
90 and self.count_diff == other.count_diff) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
91 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
92 def __str__(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
93 text = ("%s: size=%s (%s), count=%i (%+i)" |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
94 % (self.traceback, |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
95 _format_size(self.size, False), |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
96 _format_size(self.size_diff, True), |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
97 self.count, |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
98 self.count_diff)) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
99 if self.count: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
100 average = self.size / self.count |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
101 text += ", average=%s" % _format_size(average, False) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
102 return text |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
103 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
104 def __repr__(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
105 return ('<StatisticDiff traceback=%r size=%i (%+i) count=%i (%+i)>' |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
106 % (self.traceback, self.size, self.size_diff, |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
107 self.count, self.count_diff)) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
108 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
109 def _sort_key(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
110 return (abs(self.size_diff), self.size, |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
111 abs(self.count_diff), self.count, |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
112 self.traceback) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
113 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
114 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
115 def _compare_grouped_stats(old_group, new_group): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
116 statistics = [] |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
117 for traceback, stat in new_group.items(): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
118 previous = old_group.pop(traceback, None) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
119 if previous is not None: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
120 stat = StatisticDiff(traceback, |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
121 stat.size, stat.size - previous.size, |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
122 stat.count, stat.count - previous.count) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
123 else: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
124 stat = StatisticDiff(traceback, |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
125 stat.size, stat.size, |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
126 stat.count, stat.count) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
127 statistics.append(stat) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
128 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
129 for traceback, stat in old_group.items(): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
130 stat = StatisticDiff(traceback, 0, -stat.size, 0, -stat.count) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
131 statistics.append(stat) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
132 return statistics |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
133 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
134 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
135 @total_ordering |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
136 class Frame: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
137 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
138 Frame of a traceback. |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
139 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
140 __slots__ = ("_frame",) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
141 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
142 def __init__(self, frame): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
143 self._frame = frame |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
144 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
145 @property |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
146 def filename(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
147 return self._frame[0] |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
148 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
149 @property |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
150 def lineno(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
151 return self._frame[1] |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
152 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
153 def __eq__(self, other): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
154 return (self._frame == other._frame) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
155 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
156 def __lt__(self, other): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
157 return (self._frame < other._frame) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
158 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
159 def __hash__(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
160 return hash(self._frame) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
161 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
162 def __str__(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
163 return "%s:%s" % (self.filename, self.lineno) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
164 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
165 def __repr__(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
166 return "<Frame filename=%r lineno=%r>" % (self.filename, self.lineno) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
167 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
168 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
169 @total_ordering |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
170 class Traceback(Sequence): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
171 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
172 Sequence of Frame instances sorted from the most recent frame |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
173 to the oldest frame. |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
174 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
175 __slots__ = ("_frames",) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
176 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
177 def __init__(self, frames): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
178 Sequence.__init__(self) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
179 self._frames = frames |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
180 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
181 def __len__(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
182 return len(self._frames) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
183 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
184 def __getitem__(self, index): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
185 trace = self._frames[index] |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
186 return Frame(trace) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
187 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
188 def __contains__(self, frame): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
189 return frame._frame in self._frames |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
190 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
191 def __hash__(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
192 return hash(self._frames) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
193 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
194 def __eq__(self, other): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
195 return (self._frames == other._frames) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
196 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
197 def __lt__(self, other): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
198 return (self._frames < other._frames) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
199 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
200 def __str__(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
201 return str(self[0]) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
202 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
203 def __repr__(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
204 return "<Traceback %r>" % (tuple(self),) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
205 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
206 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
207 def get_object_traceback(obj): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
208 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
209 Get the traceback where the Python object *obj* was allocated. |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
210 Return a Traceback instance. |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
211 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
212 Return None if the tracemalloc module is not tracing memory allocations or |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
213 did not trace the allocation of the object. |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
214 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
215 frames = _get_object_traceback(obj) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
216 if frames is not None: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
217 return Traceback(frames) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
218 else: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
219 return None |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
220 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
221 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
222 class Trace: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
223 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
224 Trace of a memory block. |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
225 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
226 __slots__ = ("_trace",) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
227 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
228 def __init__(self, trace): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
229 self._trace = trace |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
230 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
231 @property |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
232 def size(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
233 return self._trace[0] |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
234 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
235 @property |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
236 def traceback(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
237 return Traceback(self._trace[1]) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
238 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
239 def __eq__(self, other): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
240 return (self._trace == other._trace) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
241 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
242 def __hash__(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
243 return hash(self._trace) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
244 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
245 def __str__(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
246 return "%s: %s" % (self.traceback, _format_size(self.size, False)) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
247 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
248 def __repr__(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
249 return ("<Trace size=%s, traceback=%r>" |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
250 % (_format_size(self.size, False), self.traceback)) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
251 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
252 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
253 class _Traces(Sequence): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
254 def __init__(self, traces): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
255 Sequence.__init__(self) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
256 self._traces = traces |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
257 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
258 def __len__(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
259 return len(self._traces) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
260 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
261 def __getitem__(self, index): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
262 trace = self._traces[index] |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
263 return Trace(trace) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
264 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
265 def __contains__(self, trace): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
266 return trace._trace in self._traces |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
267 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
268 def __eq__(self, other): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
269 return (self._traces == other._traces) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
270 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
271 def __repr__(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
272 return "<Traces len=%s>" % len(self) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
273 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
274 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
275 def _normalize_filename(filename): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
276 filename = os.path.normcase(filename) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
277 if filename.endswith(('.pyc', '.pyo')): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
278 filename = filename[:-1] |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
279 return filename |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
280 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
281 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
282 class Filter: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
283 def __init__(self, inclusive, filename_pattern, |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
284 lineno=None, all_frames=False): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
285 self.inclusive = inclusive |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
286 self._filename_pattern = _normalize_filename(filename_pattern) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
287 self.lineno = lineno |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
288 self.all_frames = all_frames |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
289 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
290 @property |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
291 def filename_pattern(self): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
292 return self._filename_pattern |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
293 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
294 def __match_frame(self, filename, lineno): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
295 filename = _normalize_filename(filename) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
296 if not fnmatch.fnmatch(filename, self._filename_pattern): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
297 return False |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
298 if self.lineno is None: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
299 return True |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
300 else: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
301 return (lineno == self.lineno) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
302 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
303 def _match_frame(self, filename, lineno): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
304 return self.__match_frame(filename, lineno) ^ (not self.inclusive) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
305 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
306 def _match_traceback(self, traceback): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
307 if self.all_frames: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
308 if any(self.__match_frame(filename, lineno) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
309 for filename, lineno in traceback): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
310 return self.inclusive |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
311 else: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
312 return (not self.inclusive) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
313 else: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
314 filename, lineno = traceback[0] |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
315 return self._match_frame(filename, lineno) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
316 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
317 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
318 class Snapshot: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
319 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
320 Snapshot of traces of memory blocks allocated by Python. |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
321 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
322 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
323 def __init__(self, traces, traceback_limit): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
324 self.traces = _Traces(traces) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
325 self.traceback_limit = traceback_limit |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
326 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
327 def dump(self, filename): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
328 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
329 Write the snapshot into a file. |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
330 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
331 with open(filename, "wb") as fp: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
332 pickle.dump(self, fp, pickle.HIGHEST_PROTOCOL) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
333 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
334 @staticmethod |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
335 def load(filename): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
336 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
337 Load a snapshot from a file. |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
338 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
339 with open(filename, "rb") as fp: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
340 return pickle.load(fp) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
341 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
342 def _filter_trace(self, include_filters, exclude_filters, trace): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
343 traceback = trace[1] |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
344 if include_filters: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
345 if not any(trace_filter._match_traceback(traceback) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
346 for trace_filter in include_filters): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
347 return False |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
348 if exclude_filters: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
349 if any(not trace_filter._match_traceback(traceback) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
350 for trace_filter in exclude_filters): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
351 return False |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
352 return True |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
353 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
354 def filter_traces(self, filters): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
355 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
356 Create a new Snapshot instance with a filtered traces sequence, filters |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
357 is a list of Filter instances. If filters is an empty list, return a |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
358 new Snapshot instance with a copy of the traces. |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
359 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
360 if filters: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
361 include_filters = [] |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
362 exclude_filters = [] |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
363 for trace_filter in filters: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
364 if trace_filter.inclusive: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
365 include_filters.append(trace_filter) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
366 else: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
367 exclude_filters.append(trace_filter) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
368 new_traces = [trace for trace in self.traces._traces |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
369 if self._filter_trace(include_filters, |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
370 exclude_filters, |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
371 trace)] |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
372 else: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
373 new_traces = self.traces._traces.copy() |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
374 return Snapshot(new_traces, self.traceback_limit) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
375 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
376 def _group_by(self, key_type, cumulative): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
377 if key_type not in ('traceback', 'filename', 'lineno'): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
378 raise ValueError("unknown key_type: %r" % (key_type,)) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
379 if cumulative and key_type not in ('lineno', 'filename'): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
380 raise ValueError("cumulative mode cannot by used " |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
381 "with key type %r" % key_type) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
382 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
383 stats = {} |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
384 tracebacks = {} |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
385 if not cumulative: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
386 for trace in self.traces._traces: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
387 size, trace_traceback = trace |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
388 try: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
389 traceback = tracebacks[trace_traceback] |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
390 except KeyError: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
391 if key_type == 'traceback': |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
392 frames = trace_traceback |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
393 elif key_type == 'lineno': |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
394 frames = trace_traceback[:1] |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
395 else: # key_type == 'filename': |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
396 frames = ((trace_traceback[0][0], 0),) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
397 traceback = Traceback(frames) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
398 tracebacks[trace_traceback] = traceback |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
399 try: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
400 stat = stats[traceback] |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
401 stat.size += size |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
402 stat.count += 1 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
403 except KeyError: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
404 stats[traceback] = Statistic(traceback, size, 1) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
405 else: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
406 # cumulative statistics |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
407 for trace in self.traces._traces: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
408 size, trace_traceback = trace |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
409 for frame in trace_traceback: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
410 try: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
411 traceback = tracebacks[frame] |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
412 except KeyError: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
413 if key_type == 'lineno': |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
414 frames = (frame,) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
415 else: # key_type == 'filename': |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
416 frames = ((frame[0], 0),) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
417 traceback = Traceback(frames) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
418 tracebacks[frame] = traceback |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
419 try: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
420 stat = stats[traceback] |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
421 stat.size += size |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
422 stat.count += 1 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
423 except KeyError: |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
424 stats[traceback] = Statistic(traceback, size, 1) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
425 return stats |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
426 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
427 def statistics(self, key_type, cumulative=False): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
428 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
429 Group statistics by key_type. Return a sorted list of Statistic |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
430 instances. |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
431 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
432 grouped = self._group_by(key_type, cumulative) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
433 statistics = list(grouped.values()) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
434 statistics.sort(reverse=True, key=Statistic._sort_key) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
435 return statistics |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
436 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
437 def compare_to(self, old_snapshot, key_type, cumulative=False): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
438 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
439 Compute the differences with an old snapshot old_snapshot. Get |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
440 statistics as a sorted list of StatisticDiff instances, grouped by |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
441 group_by. |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
442 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
443 new_group = self._group_by(key_type, cumulative) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
444 old_group = old_snapshot._group_by(key_type, cumulative) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
445 statistics = _compare_grouped_stats(old_group, new_group) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
446 statistics.sort(reverse=True, key=StatisticDiff._sort_key) |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
447 return statistics |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
448 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
449 |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
450 def take_snapshot(): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
451 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
452 Take a snapshot of traces of memory blocks allocated by Python. |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
453 """ |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
454 if not is_tracing(): |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
455 raise RuntimeError("the tracemalloc module must be tracing memory " |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
456 "allocations to take a snapshot") |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
457 traces = _get_traces() |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
458 traceback_limit = get_traceback_limit() |
|
6e2089dbc5ad
Issue #18874: Implement the PEP 454 (tracemalloc)
Victor Stinner <victor.stinner@gmail.com>
parents:
diff
changeset
|
459 return Snapshot(traces, traceback_limit) |
