同步操作将从 OpenHarmony-SIG/python 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
from collections.abc import Sequence, Iterablefrom functools import total_orderingimport fnmatchimport linecacheimport os.pathimport pickle# Import types and functions implemented in Cfrom _tracemalloc import *from _tracemalloc import _get_object_traceback, _get_tracesdef _format_size(size, sign):for unit in ('B', 'KiB', 'MiB', 'GiB', 'TiB'):if abs(size) < 100 and unit != 'B':# 3 digits (xx.x UNIT)if sign:return "%+.1f %s" % (size, unit)else:return "%.1f %s" % (size, unit)if abs(size) < 10 * 1024 or unit == 'TiB':# 4 or 5 digits (xxxx UNIT)if sign:return "%+.0f %s" % (size, unit)else:return "%.0f %s" % (size, unit)size /= 1024class Statistic:"""Statistic difference on memory allocations between two Snapshot instance."""__slots__ = ('traceback', 'size', 'count')def __init__(self, traceback, size, count):self.traceback = tracebackself.size = sizeself.count = countdef __hash__(self):return hash((self.traceback, self.size, self.count))def __eq__(self, other):return (self.traceback == other.tracebackand self.size == other.sizeand self.count == other.count)def __str__(self):text = ("%s: size=%s, count=%i"% (self.traceback,_format_size(self.size, False),self.count))if self.count:average = self.size / self.counttext += ", average=%s" % _format_size(average, False)return textdef __repr__(self):return ('<Statistic traceback=%r size=%i count=%i>'% (self.traceback, self.size, self.count))def _sort_key(self):return (self.size, self.count, self.traceback)class StatisticDiff:"""Statistic difference on memory allocations between an old and a newSnapshot instance."""__slots__ = ('traceback', 'size', 'size_diff', 'count', 'count_diff')def __init__(self, traceback, size, size_diff, count, count_diff):self.traceback = tracebackself.size = sizeself.size_diff = size_diffself.count = countself.count_diff = count_diffdef __hash__(self):return hash((self.traceback, self.size, self.size_diff,self.count, self.count_diff))def __eq__(self, other):return (self.traceback == other.tracebackand self.size == other.sizeand self.size_diff == other.size_diffand self.count == other.countand self.count_diff == other.count_diff)def __str__(self):text = ("%s: size=%s (%s), count=%i (%+i)"% (self.traceback,_format_size(self.size, False),_format_size(self.size_diff, True),self.count,self.count_diff))if self.count:average = self.size / self.counttext += ", average=%s" % _format_size(average, False)return textdef __repr__(self):return ('<StatisticDiff traceback=%r size=%i (%+i) count=%i (%+i)>'% (self.traceback, self.size, self.size_diff,self.count, self.count_diff))def _sort_key(self):return (abs(self.size_diff), self.size,abs(self.count_diff), self.count,self.traceback)def _compare_grouped_stats(old_group, new_group):statistics = []for traceback, stat in new_group.items():previous = old_group.pop(traceback, None)if previous is not None:stat = StatisticDiff(traceback,stat.size, stat.size - previous.size,stat.count, stat.count - previous.count)else:stat = StatisticDiff(traceback,stat.size, stat.size,stat.count, stat.count)statistics.append(stat)for traceback, stat in old_group.items():stat = StatisticDiff(traceback, 0, -stat.size, 0, -stat.count)statistics.append(stat)return statistics@total_orderingclass Frame:"""Frame of a traceback."""__slots__ = ("_frame",)def __init__(self, frame):# frame is a tuple: (filename: str, lineno: int)self._frame = frame@propertydef filename(self):return self._frame[0]@propertydef lineno(self):return self._frame[1]def __eq__(self, other):return (self._frame == other._frame)def __lt__(self, other):return (self._frame < other._frame)def __hash__(self):return hash(self._frame)def __str__(self):return "%s:%s" % (self.filename, self.lineno)def __repr__(self):return "<Frame filename=%r lineno=%r>" % (self.filename, self.lineno)@total_orderingclass Traceback(Sequence):"""Sequence of Frame instances sorted from the oldest frameto the most recent frame."""__slots__ = ("_frames",)def __init__(self, frames):Sequence.__init__(self)# frames is a tuple of frame tuples: see Frame constructor for the# format of a frame tuple; it is reversed, because _tracemalloc# returns frames sorted from most recent to oldest, but the# Python API expects oldest to most recentself._frames = tuple(reversed(frames))def __len__(self):return len(self._frames)def __getitem__(self, index):if isinstance(index, slice):return tuple(Frame(trace) for trace in self._frames[index])else:return Frame(self._frames[index])def __contains__(self, frame):return frame._frame in self._framesdef __hash__(self):return hash(self._frames)def __eq__(self, other):return (self._frames == other._frames)def __lt__(self, other):return (self._frames < other._frames)def __str__(self):return str(self[0])def __repr__(self):return "<Traceback %r>" % (tuple(self),)def format(self, limit=None, most_recent_first=False):lines = []if limit is not None:if limit > 0:frame_slice = self[-limit:]else:frame_slice = self[:limit]else:frame_slice = selfif most_recent_first:frame_slice = reversed(frame_slice)for frame in frame_slice:lines.append(' File "%s", line %s'% (frame.filename, frame.lineno))line = linecache.getline(frame.filename, frame.lineno).strip()if line:lines.append(' %s' % line)return linesdef get_object_traceback(obj):"""Get the traceback where the Python object *obj* was allocated.Return a Traceback instance.Return None if the tracemalloc module is not tracing memory allocations ordid not trace the allocation of the object."""frames = _get_object_traceback(obj)if frames is not None:return Traceback(frames)else:return Noneclass Trace:"""Trace of a memory block."""__slots__ = ("_trace",)def __init__(self, trace):# trace is a tuple: (domain: int, size: int, traceback: tuple).# See Traceback constructor for the format of the traceback tuple.self._trace = trace@propertydef domain(self):return self._trace[0]@propertydef size(self):return self._trace[1]@propertydef traceback(self):return Traceback(self._trace[2])def __eq__(self, other):return (self._trace == other._trace)def __hash__(self):return hash(self._trace)def __str__(self):return "%s: %s" % (self.traceback, _format_size(self.size, False))def __repr__(self):return ("<Trace domain=%s size=%s, traceback=%r>"% (self.domain, _format_size(self.size, False), self.traceback))class _Traces(Sequence):def __init__(self, traces):Sequence.__init__(self)# traces is a tuple of trace tuples: see Trace constructorself._traces = tracesdef __len__(self):return len(self._traces)def __getitem__(self, index):if isinstance(index, slice):return tuple(Trace(trace) for trace in self._traces[index])else:return Trace(self._traces[index])def __contains__(self, trace):return trace._trace in self._tracesdef __eq__(self, other):return (self._traces == other._traces)def __repr__(self):return "<Traces len=%s>" % len(self)def _normalize_filename(filename):filename = os.path.normcase(filename)if filename.endswith('.pyc'):filename = filename[:-1]return filenameclass BaseFilter:def __init__(self, inclusive):self.inclusive = inclusivedef _match(self, trace):raise NotImplementedErrorclass Filter(BaseFilter):def __init__(self, inclusive, filename_pattern,lineno=None, all_frames=False, domain=None):super().__init__(inclusive)self.inclusive = inclusiveself._filename_pattern = _normalize_filename(filename_pattern)self.lineno = linenoself.all_frames = all_framesself.domain = domain@propertydef filename_pattern(self):return self._filename_patterndef _match_frame_impl(self, filename, lineno):filename = _normalize_filename(filename)if not fnmatch.fnmatch(filename, self._filename_pattern):return Falseif self.lineno is None:return Trueelse:return (lineno == self.lineno)def _match_frame(self, filename, lineno):return self._match_frame_impl(filename, lineno) ^ (not self.inclusive)def _match_traceback(self, traceback):if self.all_frames:if any(self._match_frame_impl(filename, lineno)for filename, lineno in traceback):return self.inclusiveelse:return (not self.inclusive)else:filename, lineno = traceback[0]return self._match_frame(filename, lineno)def _match(self, trace):domain, size, traceback = traceres = self._match_traceback(traceback)if self.domain is not None:if self.inclusive:return res and (domain == self.domain)else:return res or (domain != self.domain)return resclass DomainFilter(BaseFilter):def __init__(self, inclusive, domain):super().__init__(inclusive)self._domain = domain@propertydef domain(self):return self._domaindef _match(self, trace):domain, size, traceback = tracereturn (domain == self.domain) ^ (not self.inclusive)class Snapshot:"""Snapshot of traces of memory blocks allocated by Python."""def __init__(self, traces, traceback_limit):# traces is a tuple of trace tuples: see _Traces constructor for# the exact formatself.traces = _Traces(traces)self.traceback_limit = traceback_limitdef dump(self, filename):"""Write the snapshot into a file."""with open(filename, "wb") as fp:pickle.dump(self, fp, pickle.HIGHEST_PROTOCOL)@staticmethoddef load(filename):"""Load a snapshot from a file."""with open(filename, "rb") as fp:return pickle.load(fp)def _filter_trace(self, include_filters, exclude_filters, trace):if include_filters:if not any(trace_filter._match(trace)for trace_filter in include_filters):return Falseif exclude_filters:if any(not trace_filter._match(trace)for trace_filter in exclude_filters):return Falsereturn Truedef filter_traces(self, filters):"""Create a new Snapshot instance with a filtered traces sequence, filtersis a list of Filter or DomainFilter instances. If filters is an emptylist, return a new Snapshot instance with a copy of the traces."""if not isinstance(filters, Iterable):raise TypeError("filters must be a list of filters, not %s"% type(filters).__name__)if filters:include_filters = []exclude_filters = []for trace_filter in filters:if trace_filter.inclusive:include_filters.append(trace_filter)else:exclude_filters.append(trace_filter)new_traces = [trace for trace in self.traces._tracesif self._filter_trace(include_filters,exclude_filters,trace)]else:new_traces = self.traces._traces.copy()return Snapshot(new_traces, self.traceback_limit)def _group_by(self, key_type, cumulative):if key_type not in ('traceback', 'filename', 'lineno'):raise ValueError("unknown key_type: %r" % (key_type,))if cumulative and key_type not in ('lineno', 'filename'):raise ValueError("cumulative mode cannot by used ""with key type %r" % key_type)stats = {}tracebacks = {}if not cumulative:for trace in self.traces._traces:domain, size, trace_traceback = tracetry:traceback = tracebacks[trace_traceback]except KeyError:if key_type == 'traceback':frames = trace_tracebackelif key_type == 'lineno':frames = trace_traceback[:1]else: # key_type == 'filename':frames = ((trace_traceback[0][0], 0),)traceback = Traceback(frames)tracebacks[trace_traceback] = tracebacktry:stat = stats[traceback]stat.size += sizestat.count += 1except KeyError:stats[traceback] = Statistic(traceback, size, 1)else:# cumulative statisticsfor trace in self.traces._traces:domain, size, trace_traceback = tracefor frame in trace_traceback:try:traceback = tracebacks[frame]except KeyError:if key_type == 'lineno':frames = (frame,)else: # key_type == 'filename':frames = ((frame[0], 0),)traceback = Traceback(frames)tracebacks[frame] = tracebacktry:stat = stats[traceback]stat.size += sizestat.count += 1except KeyError:stats[traceback] = Statistic(traceback, size, 1)return statsdef statistics(self, key_type, cumulative=False):"""Group statistics by key_type. Return a sorted list of Statisticinstances."""grouped = self._group_by(key_type, cumulative)statistics = list(grouped.values())statistics.sort(reverse=True, key=Statistic._sort_key)return statisticsdef compare_to(self, old_snapshot, key_type, cumulative=False):"""Compute the differences with an old snapshot old_snapshot. Getstatistics as a sorted list of StatisticDiff instances, grouped bygroup_by."""new_group = self._group_by(key_type, cumulative)old_group = old_snapshot._group_by(key_type, cumulative)statistics = _compare_grouped_stats(old_group, new_group)statistics.sort(reverse=True, key=StatisticDiff._sort_key)return statisticsdef take_snapshot():"""Take a snapshot of traces of memory blocks allocated by Python."""if not is_tracing():raise RuntimeError("the tracemalloc module must be tracing memory ""allocations to take a snapshot")traces = _get_traces()traceback_limit = get_traceback_limit()return Snapshot(traces, traceback_limit)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。