[Python-Dev] Updated PEP 454 (tracemalloc): no more metrics!

Victor Stinner victor.stinner at gmail.com
Wed Oct 30 18:16:45 CET 2013


> Snapshot
> --------
>
> ``Snapshot(timestamp: datetime.datetime, traceback_limit: int, stats:
> dict=None, traces: dict=None)`` class:
>
>     Snapshot of statistics and traces of memory blocks allocated by
>     Python.
>
> ``apply_filters(filters)`` method:
>
>     Apply filters on the ``traces`` and ``stats`` dictionaries,
>     *filters* is a list of ``Filter`` instances.

Snapshot.apply_filters() currently works in-place. This is not
convinient. It should create a new Snapshot instance.

For example, I have a huge snapshot with +800K traces. I would like to
ignore <unknown> and <frozen importlib._bootrap> filenames: I apply a
first filter to exclude <*>. Then I only want to see allocations
related to the regular expressions: I apply a second pair of filters
to only include */sre*.py and */re.py.

Ok, now I want to see other files. Uh oh, I loose all others traces, I
have to reload the huge snapshot. And again, exclude <*>.

I would prefer something like:

full_snapshot = Snapshot.load("huge.pickle")
clean = full_snapshot.apply_filters([Filter(False, "<*>")])
# delete maybe full_snapshot here
regex = clean.apply_filters([Filter(True, "*/re.py"), Filter(True,
"*/sre*.py")])
other = clean.apply_filters([Filter(False, "*/re.py"), Filter(False,
"*/sre*.py")])
...

> ``Filter(include: bool, filename_pattern: str, lineno: int=None,
> traceback: bool=False)`` class:
> ...
> ``traceback`` attribute:
>
>    If *traceback* is ``True``, all frames of the traceback are checked.
>    If *traceback* is ``False``, only the most recent frame is checked.
>
>    This attribute is ignored if the traceback limit is less than ``2``.
>    See the ``get_traceback_limit()`` function.

Hum, I don't really like the traceback name. traceback=False is
confusing because the traceback is used by the filter even if
traceback=False.

Other names: all_frames, any_frame, most_recent_frame_only, ...?

Example:

   f1 = Filter("*/linecache.py", all_frames=True)
   f2 = Filter("*/linecache.py")   # all_frames is False by default

Victor


More information about the Python-Dev mailing list