.. _pstats-module:

********************************************
:mod:`pstats` --- Statistics for profilers
********************************************

.. module:: pstats
   :synopsis: Statistics object for analyzing profiler output.

**Source code:** :source:`Lib/pstats.py`

--------------

The :mod:`pstats` module provides tools for reading, manipulating, and
displaying profiling statistics generated by Python's profilers. It reads
output from both :mod:`profiling.tracing` (deterministic profiler) and
:mod:`profiling.sampling` (statistical profiler).


Reading and displaying profile data
===================================

The :class:`Stats` class is the primary interface for working with profile
data. It can read statistics from files or directly from a
:class:`~profiling.tracing.Profile` object.

Load statistics from a file and print a basic report::

   import pstats

   p = pstats.Stats('profile_output.prof')
   p.print_stats()

The :class:`Stats` object provides methods for sorting and filtering the
data before printing. For example, to see the ten functions with the highest
cumulative time::

   from pstats import SortKey

   p = pstats.Stats('profile_output.prof')
   p.sort_stats(SortKey.CUMULATIVE).print_stats(10)


Working with statistics
-----------------------

The :class:`Stats` class supports method chaining, making it convenient to
perform multiple operations::

   p = pstats.Stats('restats')
   p.strip_dirs().sort_stats(-1).print_stats()

The :meth:`~Stats.strip_dirs` method removes directory paths from filenames,
making the output more compact. The :meth:`~Stats.sort_stats` method accepts
various keys to control the sort order.

Different sort keys highlight different aspects of performance::

   from pstats import SortKey

   # Functions that consume the most cumulative time
   p.sort_stats(SortKey.CUMULATIVE).print_stats(10)

   # Functions that consume the most time in their own code
   p.sort_stats(SortKey.TIME).print_stats(10)

   # Functions sorted by name
   p.sort_stats(SortKey.NAME).print_stats()


Filtering output
----------------

The :meth:`~Stats.print_stats` method accepts restrictions that filter
which functions are displayed. Restrictions can be integers (limiting the
count), floats between 0 and 1 (selecting a percentage), or strings (matching
function names via regular expression).

Print only the top 10%::

   p.print_stats(.1)

Print only functions whose names contain "init"::

   p.print_stats('init')

Combine restrictions (they apply sequentially)::

   # Top 10%, then only those containing "init"
   p.print_stats(.1, 'init')

   # Functions in files matching "foo:", limited to top 50%
   p.sort_stats(SortKey.FILENAME).print_stats('foo:', .5)


Analyzing call relationships
----------------------------

The :meth:`~Stats.print_callers` method shows which functions called each
displayed function::

   p.print_callers()

The :meth:`~Stats.print_callees` method shows the opposite relationship,
listing which functions each displayed function called::

   p.print_callees()

Both methods accept the same restriction arguments as :meth:`~Stats.print_stats`.


Combining multiple profiles
---------------------------

Statistics from multiple profiling runs can be combined into a single
:class:`Stats` object::

   # Load multiple files at once
   p = pstats.Stats('run1.prof', 'run2.prof', 'run3.prof')

   # Or add files incrementally
   p = pstats.Stats('run1.prof')
   p.add('run2.prof')
   p.add('run3.prof')

When files are combined, statistics for identical functions (same file, line,
and name) are accumulated, giving an aggregate view across all profiling runs.


The :class:`!Stats` class
=========================

.. class:: Stats(*filenames_or_profile, stream=sys.stdout)

   Create a statistics object from profile data.

   The arguments can be filenames (strings or path-like objects) or
   :class:`~profiling.tracing.Profile` objects. If multiple sources are
   provided, their statistics are combined.

   The *stream* argument specifies where output from :meth:`print_stats` and
   related methods is written. It defaults to :data:`sys.stdout`.

   The profile data format is specific to the Python version that created it.
   There is no compatibility guarantee between Python versions or between
   different profilers.

   .. method:: strip_dirs()

      Remove leading path information from all filenames.

      This method modifies the object in place and returns it for method
      chaining. After stripping, the statistics are considered to be in
      random order.

      If stripping causes two functions to become indistinguishable (same
      filename, line number, and function name), their statistics are
      combined into a single entry.

   .. method:: add(*filenames)

      Add profiling data from additional files.

      The files must have been created by the same profiler type. Statistics
      for identical functions are accumulated.

   .. method:: dump_stats(filename)

      Save the current statistics to a file.

      The file is created if it does not exist and overwritten if it does.
      The saved data can be loaded by creating a new :class:`Stats` object.

   .. method:: sort_stats(*keys)

      Sort the statistics according to the specified criteria.

      Each key can be a string or a :class:`SortKey` enum member. When
      multiple keys are provided, later keys break ties in earlier keys.

      Using :class:`SortKey` enum members is preferred over strings as it
      provides better error checking::

         from pstats import SortKey
         p.sort_stats(SortKey.CUMULATIVE)

      Valid sort keys:

      +------------------+------------------------+----------------------+
      | String           | Enum                   | Meaning              |
      +==================+========================+======================+
      | ``'calls'``      | ``SortKey.CALLS``      | call count           |
      +------------------+------------------------+----------------------+
      | ``'cumulative'`` | ``SortKey.CUMULATIVE`` | cumulative time      |
      +------------------+------------------------+----------------------+
      | ``'cumtime'``    | N/A                    | cumulative time      |
      +------------------+------------------------+----------------------+
      | ``'file'``       | N/A                    | file name            |
      +------------------+------------------------+----------------------+
      | ``'filename'``   | ``SortKey.FILENAME``   | file name            |
      +------------------+------------------------+----------------------+
      | ``'module'``     | N/A                    | file name            |
      +------------------+------------------------+----------------------+
      | ``'ncalls'``     | N/A                    | call count           |
      +------------------+------------------------+----------------------+
      | ``'pcalls'``     | ``SortKey.PCALLS``     | primitive call count |
      +------------------+------------------------+----------------------+
      | ``'line'``       | ``SortKey.LINE``       | line number          |
      +------------------+------------------------+----------------------+
      | ``'name'``       | ``SortKey.NAME``       | function name        |
      +------------------+------------------------+----------------------+
      | ``'nfl'``        | ``SortKey.NFL``        | name/file/line       |
      +------------------+------------------------+----------------------+
      | ``'stdname'``    | ``SortKey.STDNAME``    | standard name        |
      +------------------+------------------------+----------------------+
      | ``'time'``       | ``SortKey.TIME``       | internal time        |
      +------------------+------------------------+----------------------+
      | ``'tottime'``    | N/A                    | internal time        |
      +------------------+------------------------+----------------------+

      All sorts on statistics are in descending order (most time consuming
      first), while name, file, and line number sorts are ascending
      (alphabetical).

      The difference between ``SortKey.NFL`` and ``SortKey.STDNAME`` is that
      NFL sorts line numbers numerically while STDNAME sorts them as strings.
      ``sort_stats(SortKey.NFL)`` is equivalent to
      ``sort_stats(SortKey.NAME, SortKey.FILENAME, SortKey.LINE)``.

      For backward compatibility, the numeric arguments ``-1``, ``0``, ``1``,
      and ``2`` are also accepted, meaning ``'stdname'``, ``'calls'``,
      ``'time'``, and ``'cumulative'`` respectively.

      .. versionadded:: 3.7
         The :class:`SortKey` enum.

   .. method:: reverse_order()

      Reverse the current sort order.

      By default, the sort direction is chosen appropriately for the sort key
      (descending for time-based keys, ascending for name-based keys). This
      method inverts that choice.

   .. method:: print_stats(*restrictions)

      Print a report of the profiling statistics.

      The output includes a header line summarizing the data, followed by a
      table of function statistics sorted according to the last
      :meth:`sort_stats` call.

      Restrictions filter the output. Each restriction is either:

      - An integer: limits output to that many entries
      - A float between 0.0 and 1.0: selects that fraction of entries
      - A string: matches function names via regular expression

      Restrictions are applied sequentially. For example::

         print_stats(.1, 'foo:')

      First limits to the top 10%, then filters to functions matching 'foo:'.

   .. method:: print_callers(*restrictions)

      Print the callers of each function in the statistics.

      For each function in the filtered results, shows which functions called
      it and how often.

      With :mod:`profiling.tracing` (or ``cProfile``), each caller line
      shows three numbers: the number of calls from that caller, and the
      total and cumulative times for those specific calls.

      Accepts the same restriction arguments as :meth:`print_stats`.

   .. method:: print_callees(*restrictions)

      Print the functions called by each function in the statistics.

      This is the inverse of :meth:`print_callers`, showing which functions
      each listed function called.

      Accepts the same restriction arguments as :meth:`print_stats`.

   .. method:: get_stats_profile()

      Return a ``StatsProfile`` object containing the statistics.

      The returned object provides programmatic access to the profile data,
      with function names mapped to ``FunctionProfile`` objects
      containing timing and call count information.

      .. versionadded:: 3.9


.. class:: SortKey

   An enumeration of valid sort keys for :meth:`Stats.sort_stats`.

   .. attribute:: CALLS

      Sort by call count.

   .. attribute:: CUMULATIVE

      Sort by cumulative time.

   .. attribute:: FILENAME

      Sort by file name.

   .. attribute:: LINE

      Sort by line number.

   .. attribute:: NAME

      Sort by function name.

   .. attribute:: NFL

      Sort by name, then file, then line number (numeric line sort).

   .. attribute:: PCALLS

      Sort by primitive (non-recursive) call count.

   .. attribute:: STDNAME

      Sort by standard name (string-based line sort).

   .. attribute:: TIME

      Sort by internal time (time in function excluding subcalls).


.. _pstats-cli:

Command-line interface
======================

The :mod:`pstats` module can be invoked as a script to interactively browse
profile data::

   python -m pstats profile_output.prof

This opens a line-oriented interface (built on :mod:`cmd`) for examining the
statistics. Type ``help`` at the prompt for available commands.


.. seealso::

   :mod:`profiling`
      Overview of Python profiling tools.

   :mod:`profiling.tracing`
      Deterministic tracing profiler.

   :mod:`profiling.sampling`
      Statistical sampling profiler.
