* Add Trace, Traceback and Frame classes: generated on-demand read-only views
  of traces
* Add a new StatisticDiff class and add new Snapshot.compare_to() method.
  The method return a list of StatisticDiff instances and replaces the
  compare_to parameter of Snapshot.statistics()
* Remove Statistic.size_diff and Statistic.count_diff attributes
* Remove get_traces()
This commit is contained in:
Victor Stinner 2013-11-08 16:25:13 +01:00
parent b4fb332c27
commit 4841d22de4
1 changed files with 144 additions and 72 deletions

View File

@ -161,13 +161,20 @@ Main functions
``take_snapshot()`` function:
Take a snapshot of traces of memory blocks allocated by Python using
the ``get_traces()`` function. Return a new ``Snapshot`` instance.
Take a snapshot of traces of memory blocks allocated by Python.
Return a new ``Snapshot`` instance.
The snapshot does not include memory blocks allocated before the
``tracemalloc`` module started to trace memory allocations nor
memory blocks ignored by filters (see ``get_filters()``).
Tracebacks of traces are limited to ``traceback_limit`` frames. Use
``set_traceback_limit()`` to store more frames.
The ``tracemalloc`` module must be tracing memory allocations to
take a snapshot, see the the ``start()`` function.
See also ``get_traces()`` and ``get_object_traceback()`` functions.
See also the ``get_object_traceback()`` function.
Trace functions
@ -175,31 +182,15 @@ Trace functions
When Python allocates a memory block, ``tracemalloc`` attachs a "trace" to
the memory block to store its size in bytes and the traceback where the
allocation occurred.
The following functions give access to these traces. A trace is a ``(size: int,
traceback)`` tuple. *size* is the size of the memory block in bytes.
*traceback* is a tuple of frames sorted from the most recent to the oldest
frame, limited to ``get_traceback_limit()`` frames. A frame is
a ``(filename: str, lineno: int)`` tuple.
A traceback contains at least ``1`` frame. If the ``tracemalloc`` module
failed to get a frame, the ``"<unknown>"`` filename and the line number ``0``
are used. If it failed to get the traceback or if the traceback limit is ``0``,
the traceback is ``(('<unknown>', 0),)``.
Example of a trace: ``(32, (('x.py', 7), ('x.py', 11)))``. The memory block
has a size of 32 bytes and was allocated at ``x.py:7``, line called from line
``x.py:11``.
allocation occurred. See the ``Trace`` class.
``get_object_traceback(obj)`` function:
Get the traceback where the Python object *obj* was allocated.
Return a tuple of ``(filename: str, lineno: int)`` tuples.
Return ``None`` if the ``tracemalloc`` module is not tracing memory
allocations or did not trace the allocation of the object.
Return a ``Traceback`` instance, or ``None`` if the ``tracemalloc``
module is not tracing memory allocations or did not trace the
allocation of the object.
See also ``gc.get_referrers()`` and ``sys.getsizeof()`` functions.
@ -214,30 +205,6 @@ has a size of 32 bytes and was allocated at ``x.py:7``, line called from line
Use the ``set_traceback_limit()`` function to change the limit.
``get_traces()`` function:
Get traces of memory blocks allocated by Python. Return a list of
``(size: int, traceback: tuple)`` tuples. *traceback* is a tuple of
``(filename: str, lineno: int)`` tuples.
The list of traces does not include memory blocks allocated before
the ``tracemalloc`` module started to trace memory allocations nor
memory blocks ignored by filters (see ``get_filters()``).
The list has an undefined order. Take a snapshot using
``take_snapshot()`` and use the ``Snapshot.statistics()`` method to
get a sorted list of statistics.
Tracebacks of traces are limited to ``traceback_limit`` frames. Use
``set_traceback_limit()`` to store more frames.
Return an empty list if the ``tracemalloc`` module is not tracing
memory allocations.
See also ``take_snapshot()`` and ``get_object_traceback()``
functions.
``set_traceback_limit(nframe: int)`` function:
Set the maximum number of frames stored in the traceback of a trace.
@ -351,10 +318,28 @@ Filter
See the ``get_traceback_limit()`` function.
Frame
-----
``Frame`` class:
Frame of a traceback.
The ``Traceback`` class is a sequence of ``Frame`` instances.
``filename`` attribute:
Filename (``str``).
``lineno`` attribute:
Line number (``int``).
Snapshot
--------
``Snapshot(timestamp: datetime.datetime, traceback_limit: int, traces: dict=None)`` class:
``Snapshot`` class:
Snapshot of traces of memory blocks allocated by Python.
@ -362,14 +347,28 @@ Snapshot
``apply_filters(filters)`` method:
Apply filters on the ``traces`` dictionary, *filters* is a list of
``Filter`` instances. Return a new ``Snapshot`` instance with the
filtered traces.
Create a new ``Snapshot`` instance with the filtered ``traces``,
*filters* is a list of ``Filter`` instances.
If *filters* is an empty list, return a new ``Snapshot`` instance
with a copy of the traces.
``compare_to(old_snapshot: Snapshot, group_by: str, cumulative: bool=False)`` method:
Compute the differences with an old snapshot *old_snapshot*. Get
statistics as a sorted list of ``StatisticDiff`` instances, grouped
by *group_by*.
See the ``statistics()`` method for *group_by* and *cumulative*
parameters.
The result is sorted from the biggest to the smallest by: absolute
value of ``StatisticDiff.size_diff``, ``StatisticDiff.size``,
absolute value of ``StatisticDiff.count_diff``, ``Statistic.count``
and then by ``StatisticDiff.traceback``.
``dump(filename)`` method:
Write the snapshot into a file.
@ -384,7 +383,7 @@ Snapshot
See also ``dump()``.
``statistics(group_by: str, cumulative: bool=False, compare_to=None)`` method:
``statistics(group_by: str, cumulative: bool=False)`` method:
Get statistics as a sorted list of ``Statistic`` instances, grouped
by *group_by*:
@ -403,15 +402,9 @@ Snapshot
``'filename'`` and ``'lineno'`` with ``traceback_limit`` greater
than ``1``.
If *compare_to* is set to a previous ``Snapshot`` instance, compute
the differences betwen the two snapshots. Otherwise,
``Statistic.size_diff`` and ``Statistic.count_diff`` attributes are
set to zero.
The result is sorted from the biggest to the smallest by: absolute
value of ``Statistic.size_diff``, ``Statistic.size``, absolute value
of ``Statistic.count_diff``, ``Statistic.count`` and then by
``Statistic.key``.
The result is sorted from the biggest to the smallest by:
``Statistic.size``, ``Statistic.count`` and then by
``Statistic.traceback``.
``traceback_limit`` attribute:
@ -421,8 +414,11 @@ Snapshot
``traces`` attribute:
Traces of all memory blocks allocated by Python: see the
``get_traces()`` function.
Traces of all memory blocks allocated by Python: sequence of
``Trace`` instances.
The sequence has an undefined order. Use the
``Snapshot.statistics()`` method to get a sorted list of statistics.
``timestamp`` attribute:
@ -433,7 +429,7 @@ Snapshot
Statistic
---------
``Statistic(key, size, size_diff, count, count_diff)`` class:
``Statistic`` class:
Statistic on memory allocations.
@ -442,25 +438,101 @@ Statistic
``Snapshot.statistics()`` returns a list of ``Statistic`` instances.
``traceback`` attribute:
Tuple of ``(filename: str, lineno: int)`` tuples.
See also the ``StatisticDiff`` class.
``count`` attribute:
Number of memory blocks (``int``).
``count_diff`` attribute:
Difference of number of memory blocks (``int``).
``size`` attribute:
Total size of memory blocks in bytes (``int``).
``traceback`` attribute:
Traceback where the memory block was allocated, ``Traceback``
instance.
StatisticDiff
-------------
``StatisticDiff`` class:
Statistic difference on memory allocations between an old and a new
``Snapshot`` instance.
``Snapshot.compare_to()`` returns a list of ``StatisticDiff``
instances. See also the ``Statistic`` class.
``count`` attribute:
Number of memory blocks in the new snapshot (``int``): ``0`` if the
memory blocks have been released in the new snapshot.
``count_diff`` attribute:
Difference of number of memory blocks between the old and the new
snapshots (``int``): ``0`` if the memory blocks have been allocated
in the new snapshot.
``size`` attribute:
Total size of memory blocks in bytes in the new snapshot (``int``):
``0`` if the memory blocks have been released in the new snapshot.
``size_diff`` attribute:
Difference of total size of memory blocks in bytes (``int``).
Difference of total size of memory blocks in bytes between the old
and the new snapshots (``int``): ``0`` if the memory blocks have
been allocated in the new snapshot.
``traceback`` attribute:
Traceback where the memory blocks were allocated, ``Traceback``
instance.
Trace
-----
``Trace`` class:
Trace of a memory block.
The ``Snapshot.traces`` attribute is a sequence of ``Trace``
instances.
``size`` attribute:
Size of the memory block in bytes (``int``).
``traceback`` attribute:
Traceback where the memory block was allocated, ``Traceback``
instance.
Traceback
---------
``Traceback`` class:
Sequence of ``Frame`` instances sorted from the most recent frame to
the oldest frame.
A traceback contains at least ``1`` frame. If the ``tracemalloc``
module failed to get a frame, the filename ``"<unknown>"`` and the
line number ``0`` are used. If it failed to get the traceback or if
the traceback limit is ``0``, the traceback only contains a frame:
filename ``'<unknown>'`` and line number ``0``.
When a snapshot is taken, tracebacks of traces are limited to
``get_traceback_limit()`` frames. See the ``take_snapshot()``
function.
The ``Trace.traceback`` attribute is an instance of ``Traceback``
instance.
Rejected Alternatives