716 lines
56 KiB
HTML
716 lines
56 KiB
HTML
<!DOCTYPE html>
|
||
|
||
<html lang="en" data-content_root="../">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
<meta property="og:title" content="profile — Pure Python profiler" />
|
||
<meta property="og:type" content="website" />
|
||
<meta property="og:url" content="https://docs.python.org/3/library/profile.html" />
|
||
<meta property="og:site_name" content="Python documentation" />
|
||
<meta property="og:description" content="Source code: Lib/profile.py The profile module is deprecated and will be removed in Python 3.17. Use profiling.tracing instead. The profile module provides a pure Python implementation of a determi..." />
|
||
<meta property="og:image" content="_static/og-image.png" />
|
||
<meta property="og:image:alt" content="Python documentation" />
|
||
<meta name="description" content="Source code: Lib/profile.py The profile module is deprecated and will be removed in Python 3.17. Use profiling.tracing instead. The profile module provides a pure Python implementation of a determi..." />
|
||
<meta name="theme-color" content="#3776ab">
|
||
<meta property="og:image:width" content="200">
|
||
<meta property="og:image:height" content="200">
|
||
|
||
<title>profile — Pure Python profiler — Python 3.15.0 documentation</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
|
||
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=b86133f3" />
|
||
<link rel="stylesheet" type="text/css" href="../_static/classic.css?v=234b1a7c" />
|
||
<link rel="stylesheet" type="text/css" href="../_static/pydoctheme.css?v=48df1187" />
|
||
<link id="pygments_dark_css" media="(prefers-color-scheme: dark)" rel="stylesheet" type="text/css" href="../_static/pygments_dark.css?v=0fc419ee" />
|
||
|
||
<script src="../_static/documentation_options.js?v=0fe728b1"></script>
|
||
<script src="../_static/doctools.js?v=9bcbadda"></script>
|
||
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
|
||
|
||
<script src="../_static/sidebar.js"></script>
|
||
|
||
<link rel="search" type="application/opensearchdescription+xml"
|
||
title="Search within Python 3.15.0 documentation"
|
||
href="../_static/opensearch.xml"/>
|
||
<link rel="author" title="About these documents" href="../about.html" />
|
||
<link rel="index" title="Index" href="../genindex.html" />
|
||
<link rel="search" title="Search" href="../search.html" />
|
||
<link rel="copyright" title="Copyright" href="../copyright.html" />
|
||
<link rel="next" title="Removed Modules" href="removed.html" />
|
||
<link rel="prev" title="getopt — C-style parser for command line options" href="getopt.html" />
|
||
|
||
|
||
<link rel="canonical" href="https://docs.python.org/3/library/profile.html">
|
||
|
||
|
||
|
||
|
||
<style>
|
||
@media only screen {
|
||
table.full-width-table {
|
||
width: 100%;
|
||
}
|
||
}
|
||
</style>
|
||
<link rel="stylesheet" href="../_static/pydoctheme_dark.css" media="(prefers-color-scheme: dark)" id="pydoctheme_dark_css">
|
||
<link rel="shortcut icon" type="image/png" href="../_static/py.svg">
|
||
<script type="text/javascript" src="../_static/copybutton.js"></script>
|
||
<script type="text/javascript" src="../_static/menu.js"></script>
|
||
<script type="text/javascript" src="../_static/search-focus.js"></script>
|
||
<script type="text/javascript" src="../_static/themetoggle.js"></script>
|
||
<script type="text/javascript" src="../_static/rtd_switcher.js"></script>
|
||
<meta name="readthedocs-addons-api-version" content="1">
|
||
|
||
</head>
|
||
<body>
|
||
<div class="mobile-nav">
|
||
<input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
|
||
aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu">
|
||
<nav class="nav-content" role="navigation">
|
||
<label for="menuToggler" class="toggler__label">
|
||
<span></span>
|
||
</label>
|
||
<span class="nav-items-wrapper">
|
||
<a href="https://www.python.org/" class="nav-logo">
|
||
<img src="../_static/py.svg" alt="Python logo">
|
||
</a>
|
||
<span class="version_switcher_placeholder"></span>
|
||
<form role="search" class="search" action="../search.html" method="get">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
|
||
<path fill-rule="nonzero" fill="currentColor" d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
|
||
</svg>
|
||
<input placeholder="Quick search" aria-label="Quick search" type="search" name="q">
|
||
<input type="submit" value="Go">
|
||
</form>
|
||
</span>
|
||
</nav>
|
||
<div class="menu-wrapper">
|
||
<nav class="menu" role="navigation" aria-label="main navigation">
|
||
<div class="language_switcher_placeholder"></div>
|
||
|
||
<label class="theme-selector-label">
|
||
Theme
|
||
<select class="theme-selector" oninput="activateTheme(this.value)">
|
||
<option value="auto" selected>Auto</option>
|
||
<option value="light">Light</option>
|
||
<option value="dark">Dark</option>
|
||
</select>
|
||
</label>
|
||
<div>
|
||
<h3><a href="../contents.html">Table of Contents</a></h3>
|
||
<ul>
|
||
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code> — Pure Python profiler</a><ul>
|
||
<li><a class="reference internal" href="#migration">Migration</a></li>
|
||
<li><a class="reference internal" href="#profile-and-profiling-tracing-module-reference"><code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code> and <code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code> module reference</a></li>
|
||
<li><a class="reference internal" href="#differences-from-profiling-tracing">Differences from <code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code></a></li>
|
||
<li><a class="reference internal" href="#what-is-deterministic-profiling">What is deterministic profiling?</a></li>
|
||
<li><a class="reference internal" href="#limitations">Limitations</a></li>
|
||
<li><a class="reference internal" href="#calibration">Calibration</a></li>
|
||
<li><a class="reference internal" href="#using-a-custom-timer">Using a custom timer</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
|
||
</div>
|
||
<div>
|
||
<h4>Previous topic</h4>
|
||
<p class="topless"><a href="getopt.html"
|
||
title="previous chapter"><code class="xref py py-mod docutils literal notranslate"><span class="pre">getopt</span></code> — C-style parser for command line options</a></p>
|
||
</div>
|
||
<div>
|
||
<h4>Next topic</h4>
|
||
<p class="topless"><a href="removed.html"
|
||
title="next chapter">Removed Modules</a></p>
|
||
</div>
|
||
<script>
|
||
document.addEventListener('DOMContentLoaded', () => {
|
||
const title = document.querySelector('meta[property="og:title"]').content;
|
||
const elements = document.querySelectorAll('.improvepage');
|
||
const pageurl = window.location.href.split('?')[0];
|
||
elements.forEach(element => {
|
||
const url = new URL(element.href.split('?')[0].replace("-nojs", ""));
|
||
url.searchParams.set('pagetitle', title);
|
||
url.searchParams.set('pageurl', pageurl);
|
||
url.searchParams.set('pagesource', "library/profile.rst");
|
||
element.href = url.toString();
|
||
});
|
||
});
|
||
</script>
|
||
<div role="note" aria-label="source link">
|
||
<h3>This page</h3>
|
||
<ul class="this-page-menu">
|
||
<li><a href="../bugs.html">Report a bug</a></li>
|
||
<li><a class="improvepage" href="../improve-page-nojs.html">Improve this page</a></li>
|
||
<li>
|
||
<a href="https://github.com/python/cpython/blob/3.15/Doc/library/profile.rst?plain=1"
|
||
rel="nofollow">Show source
|
||
</a>
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
<div class="related" role="navigation" aria-label="Related">
|
||
<h3>Navigation</h3>
|
||
<ul>
|
||
<li class="right" style="margin-right: 10px">
|
||
<a href="../genindex.html" title="General Index"
|
||
accesskey="I">index</a></li>
|
||
<li class="right" >
|
||
<a href="../py-modindex.html" title="Python Module Index"
|
||
>modules</a> |</li>
|
||
<li class="right" >
|
||
<a href="removed.html" title="Removed Modules"
|
||
accesskey="N">next</a> |</li>
|
||
<li class="right" >
|
||
<a href="getopt.html" title="getopt — C-style parser for command line options"
|
||
accesskey="P">previous</a> |</li>
|
||
|
||
<li class="root-icon"><img src="../_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"></li>
|
||
<li><a href="https://www.python.org/">Python</a> »</li>
|
||
<li class="switchers">
|
||
<div class="language_switcher_placeholder"></div>
|
||
<div class="version_switcher_placeholder"></div>
|
||
</li>
|
||
<li>
|
||
|
||
</li>
|
||
<li id="cpython-language-and-version">
|
||
<a href="../index.html">3.15.0 Documentation</a> »
|
||
</li>
|
||
|
||
<li class="nav-item nav-item-1"><a href="index.html" >The Python standard library</a> »</li>
|
||
<li class="nav-item nav-item-2"><a href="superseded.html" accesskey="U">Superseded modules</a> »</li>
|
||
<li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code> — Pure Python profiler</a></li>
|
||
<li class="right">
|
||
|
||
|
||
<div class="inline-search" role="search">
|
||
<form class="inline-search" action="../search.html" method="get">
|
||
<input placeholder="Quick search" aria-label="Quick search" type="search" name="q" id="search-box">
|
||
<input type="submit" value="Go">
|
||
</form>
|
||
</div>
|
||
|
|
||
</li>
|
||
<li class="right">
|
||
<label class="theme-selector-label">
|
||
Theme
|
||
<select class="theme-selector" oninput="activateTheme(this.value)">
|
||
<option value="auto" selected>Auto</option>
|
||
<option value="light">Light</option>
|
||
<option value="dark">Dark</option>
|
||
</select>
|
||
</label> |</li>
|
||
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="document">
|
||
<div class="documentwrapper">
|
||
<div class="bodywrapper">
|
||
<div class="body" role="main">
|
||
|
||
<section id="module-profile">
|
||
<span id="profile-pure-python-profiler"></span><span id="profile"></span><h1><code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code> — Pure Python profiler<a class="headerlink" href="#module-profile" title="Link to this heading">¶</a></h1>
|
||
<p><strong>Source code:</strong> <a class="extlink-source reference external" href="https://github.com/python/cpython/tree/3.15/Lib/profile.py">Lib/profile.py</a></p>
|
||
<hr class="docutils" />
|
||
<div class="deprecated-removed">
|
||
<p><span class="versionmodified deprecated">Deprecated since version 3.15, will be removed in version 3.17.</span></p>
|
||
</div>
|
||
<p>The <code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code> module is deprecated and will be removed in Python 3.17.
|
||
Use <a class="reference internal" href="profiling.tracing.html#module-profiling.tracing" title="profiling.tracing: Deterministic tracing profiler for Python programs."><code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code></a> instead.</p>
|
||
<p>The <code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code> module provides a pure Python implementation of a
|
||
deterministic profiler. While useful for understanding profiler internals or
|
||
extending profiler behavior through subclassing, its pure Python implementation
|
||
introduces significant overhead compared to the C-based <a class="reference internal" href="profiling.tracing.html#module-profiling.tracing" title="profiling.tracing: Deterministic tracing profiler for Python programs."><code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code></a>
|
||
module.</p>
|
||
<p>For most profiling tasks, use:</p>
|
||
<ul class="simple">
|
||
<li><p><a class="reference internal" href="profiling.sampling.html#module-profiling.sampling" title="profiling.sampling: Statistical sampling profiler for Python processes."><code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.sampling</span></code></a> for production debugging with zero overhead</p></li>
|
||
<li><p><a class="reference internal" href="profiling.tracing.html#module-profiling.tracing" title="profiling.tracing: Deterministic tracing profiler for Python programs."><code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code></a> for development and testing</p></li>
|
||
</ul>
|
||
<section id="migration">
|
||
<h2>Migration<a class="headerlink" href="#migration" title="Link to this heading">¶</a></h2>
|
||
<p>Migrating from <code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code> to <a class="reference internal" href="profiling.tracing.html#module-profiling.tracing" title="profiling.tracing: Deterministic tracing profiler for Python programs."><code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code></a> is straightforward.
|
||
The APIs are compatible:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Old (deprecated)</span>
|
||
<span class="kn">import</span><span class="w"> </span><span class="nn">profile</span>
|
||
<span class="n">profile</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s1">'my_function()'</span><span class="p">)</span>
|
||
|
||
<span class="c1"># New (recommended)</span>
|
||
<span class="kn">import</span><span class="w"> </span><span class="nn">profiling.tracing</span>
|
||
<span class="n">profiling</span><span class="o">.</span><span class="n">tracing</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s1">'my_function()'</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>For most code, replacing <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">profile</span></code> with <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">profiling.tracing</span></code>
|
||
(and using <code class="docutils literal notranslate"><span class="pre">profiling.tracing</span></code> instead of <code class="docutils literal notranslate"><span class="pre">profile</span></code> throughout) provides
|
||
a straightforward migration path.</p>
|
||
<div class="admonition note">
|
||
<p class="admonition-title">Note</p>
|
||
<p>The <code class="docutils literal notranslate"><span class="pre">cProfile</span></code> module remains available as a backward-compatible alias
|
||
to <a class="reference internal" href="profiling.tracing.html#module-profiling.tracing" title="profiling.tracing: Deterministic tracing profiler for Python programs."><code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code></a>. Existing code using <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">cProfile</span></code> will
|
||
continue to work without modification.</p>
|
||
</div>
|
||
</section>
|
||
<section id="profile-and-profiling-tracing-module-reference">
|
||
<h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code> and <code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code> module reference<a class="headerlink" href="#profile-and-profiling-tracing-module-reference" title="Link to this heading">¶</a></h2>
|
||
<p>Both the <code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code> and <a class="reference internal" href="profiling.tracing.html#module-profiling.tracing" title="profiling.tracing: Deterministic tracing profiler for Python programs."><code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code></a> modules provide the
|
||
following functions:</p>
|
||
<dl class="py function">
|
||
<dt class="sig sig-object py" id="profile.run">
|
||
<span class="sig-prename descclassname"><span class="pre">profile.</span></span><span class="sig-name descname"><span class="pre">run</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">command</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">filename</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sort</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">-1</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#profile.run" title="Link to this definition">¶</a></dt>
|
||
<dd><p>This function takes a single argument that can be passed to the <a class="reference internal" href="../builtins/functions.html#exec" title="exec"><code class="xref py py-func docutils literal notranslate"><span class="pre">exec()</span></code></a>
|
||
function, and an optional file name. In all cases this routine executes:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">exec</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="n">__main__</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">,</span> <span class="n">__main__</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>and gathers profiling statistics from the execution. If no file name is
|
||
present, then this function automatically creates a <a class="reference internal" href="pstats.html#pstats.Stats" title="pstats.Stats"><code class="xref py py-class docutils literal notranslate"><span class="pre">Stats</span></code></a>
|
||
instance and prints a simple profiling report. If the sort value is specified,
|
||
it is passed to this <code class="xref py py-class docutils literal notranslate"><span class="pre">Stats</span></code> instance to control how the
|
||
results are sorted.</p>
|
||
</dd></dl>
|
||
|
||
<dl class="py function">
|
||
<dt class="sig sig-object py" id="profile.runctx">
|
||
<span class="sig-prename descclassname"><span class="pre">profile.</span></span><span class="sig-name descname"><span class="pre">runctx</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">command</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">globals</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">locals</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">filename</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sort</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">-1</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#profile.runctx" title="Link to this definition">¶</a></dt>
|
||
<dd><p>This function is similar to <a class="reference internal" href="#profile.run" title="profile.run"><code class="xref py py-func docutils literal notranslate"><span class="pre">run()</span></code></a>, with added arguments to supply the
|
||
globals and locals mappings for the <em>command</em> string. This routine
|
||
executes:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">exec</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="nb">globals</span><span class="p">,</span> <span class="nb">locals</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>and gathers profiling statistics as in the <a class="reference internal" href="#profile.run" title="profile.run"><code class="xref py py-func docutils literal notranslate"><span class="pre">run()</span></code></a> function above.</p>
|
||
</dd></dl>
|
||
|
||
<dl class="py class">
|
||
<dt class="sig sig-object py" id="profile.Profile">
|
||
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">profile.</span></span><span class="sig-name descname"><span class="pre">Profile</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">timer</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">timeunit</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">subcalls</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">builtins</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#profile.Profile" title="Link to this definition">¶</a></dt>
|
||
<dd><p>This class is normally only used if more precise control over profiling is
|
||
needed than what the <a class="reference internal" href="profiling.tracing.html#profiling.tracing.run" title="profiling.tracing.run"><code class="xref py py-func docutils literal notranslate"><span class="pre">profiling.tracing.run()</span></code></a> function provides.</p>
|
||
<p>A custom timer can be supplied for measuring how long code takes to run via
|
||
the <em>timer</em> argument. This must be a function that returns a single number
|
||
representing the current time. If the number is an integer, the <em>timeunit</em>
|
||
specifies a multiplier that specifies the duration of each unit of time. For
|
||
example, if the timer returns times measured in thousands of seconds, the
|
||
time unit would be <code class="docutils literal notranslate"><span class="pre">.001</span></code>.</p>
|
||
<p>Directly using the <code class="xref py py-class docutils literal notranslate"><span class="pre">Profile</span></code> class allows formatting profile results
|
||
without writing the profile data to a file:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">profiling.tracing</span>
|
||
<span class="kn">import</span><span class="w"> </span><span class="nn">pstats</span>
|
||
<span class="kn">import</span><span class="w"> </span><span class="nn">io</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">pstats</span><span class="w"> </span><span class="kn">import</span> <span class="n">SortKey</span>
|
||
|
||
<span class="n">pr</span> <span class="o">=</span> <span class="n">profiling</span><span class="o">.</span><span class="n">tracing</span><span class="o">.</span><span class="n">Profile</span><span class="p">()</span>
|
||
<span class="n">pr</span><span class="o">.</span><span class="n">enable</span><span class="p">()</span>
|
||
<span class="c1"># ... do something ...</span>
|
||
<span class="n">pr</span><span class="o">.</span><span class="n">disable</span><span class="p">()</span>
|
||
<span class="n">s</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">StringIO</span><span class="p">()</span>
|
||
<span class="n">sortby</span> <span class="o">=</span> <span class="n">SortKey</span><span class="o">.</span><span class="n">CUMULATIVE</span>
|
||
<span class="n">ps</span> <span class="o">=</span> <span class="n">pstats</span><span class="o">.</span><span class="n">Stats</span><span class="p">(</span><span class="n">pr</span><span class="p">,</span> <span class="n">stream</span><span class="o">=</span><span class="n">s</span><span class="p">)</span><span class="o">.</span><span class="n">sort_stats</span><span class="p">(</span><span class="n">sortby</span><span class="p">)</span>
|
||
<span class="n">ps</span><span class="o">.</span><span class="n">print_stats</span><span class="p">()</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">getvalue</span><span class="p">())</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>The <code class="xref py py-class docutils literal notranslate"><span class="pre">Profile</span></code> class can also be used as a context manager (supported
|
||
only in <a class="reference internal" href="profiling.tracing.html#module-profiling.tracing" title="profiling.tracing: Deterministic tracing profiler for Python programs."><code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code></a>, not in the deprecated <code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code>
|
||
module; see <a class="reference internal" href="../builtins/stdtypes.html#typecontextmanager"><span class="std std-ref">Context Manager Types</span></a>):</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">profiling.tracing</span>
|
||
|
||
<span class="k">with</span> <span class="n">profiling</span><span class="o">.</span><span class="n">tracing</span><span class="o">.</span><span class="n">Profile</span><span class="p">()</span> <span class="k">as</span> <span class="n">pr</span><span class="p">:</span>
|
||
<span class="c1"># ... do something ...</span>
|
||
|
||
<span class="n">pr</span><span class="o">.</span><span class="n">print_stats</span><span class="p">()</span>
|
||
</pre></div>
|
||
</div>
|
||
<div class="versionchanged">
|
||
<p><span class="versionmodified changed">Changed in version 3.8: </span>Added context manager support.</p>
|
||
</div>
|
||
<dl class="py method">
|
||
<dt class="sig sig-object py" id="profile.Profile.enable">
|
||
<span class="sig-name descname"><span class="pre">enable</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#profile.Profile.enable" title="Link to this definition">¶</a></dt>
|
||
<dd><p>Start collecting profiling data. Only in <a class="reference internal" href="profiling.tracing.html#module-profiling.tracing" title="profiling.tracing: Deterministic tracing profiler for Python programs."><code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code></a>.</p>
|
||
</dd></dl>
|
||
|
||
<dl class="py method">
|
||
<dt class="sig sig-object py" id="profile.Profile.disable">
|
||
<span class="sig-name descname"><span class="pre">disable</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#profile.Profile.disable" title="Link to this definition">¶</a></dt>
|
||
<dd><p>Stop collecting profiling data. Only in <a class="reference internal" href="profiling.tracing.html#module-profiling.tracing" title="profiling.tracing: Deterministic tracing profiler for Python programs."><code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code></a>.</p>
|
||
</dd></dl>
|
||
|
||
<dl class="py method">
|
||
<dt class="sig sig-object py" id="profile.Profile.create_stats">
|
||
<span class="sig-name descname"><span class="pre">create_stats</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#profile.Profile.create_stats" title="Link to this definition">¶</a></dt>
|
||
<dd><p>Stop collecting profiling data and record the results internally
|
||
as the current profile.</p>
|
||
</dd></dl>
|
||
|
||
<dl class="py method">
|
||
<dt class="sig sig-object py" id="profile.Profile.print_stats">
|
||
<span class="sig-name descname"><span class="pre">print_stats</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">sort</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">-1</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#profile.Profile.print_stats" title="Link to this definition">¶</a></dt>
|
||
<dd><p>Create a <a class="reference internal" href="pstats.html#pstats.Stats" title="pstats.Stats"><code class="xref py py-class docutils literal notranslate"><span class="pre">Stats</span></code></a> object based on the current
|
||
profile and print the results to stdout.</p>
|
||
<p>The <em>sort</em> parameter specifies the sorting order of the displayed
|
||
statistics. It accepts a single key or a tuple of keys to enable
|
||
multi-level sorting, as in <a class="reference internal" href="pstats.html#pstats.Stats.sort_stats" title="pstats.Stats.sort_stats"><code class="xref py py-meth docutils literal notranslate"><span class="pre">pstats.Stats.sort_stats()</span></code></a>.</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">Added in version 3.13: </span><code class="xref py py-meth docutils literal notranslate"><span class="pre">print_stats()</span></code> now accepts a tuple of keys.</p>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
<dl class="py method">
|
||
<dt class="sig sig-object py" id="profile.Profile.dump_stats">
|
||
<span class="sig-name descname"><span class="pre">dump_stats</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filename</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#profile.Profile.dump_stats" title="Link to this definition">¶</a></dt>
|
||
<dd><p>Write the results of the current profile to <em>filename</em>.</p>
|
||
</dd></dl>
|
||
|
||
<dl class="py method">
|
||
<dt class="sig sig-object py" id="profile.Profile.run">
|
||
<span class="sig-name descname"><span class="pre">run</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cmd</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#profile.Profile.run" title="Link to this definition">¶</a></dt>
|
||
<dd><p>Profile the cmd via <a class="reference internal" href="../builtins/functions.html#exec" title="exec"><code class="xref py py-func docutils literal notranslate"><span class="pre">exec()</span></code></a>.</p>
|
||
</dd></dl>
|
||
|
||
<dl class="py method">
|
||
<dt class="sig sig-object py" id="profile.Profile.runctx">
|
||
<span class="sig-name descname"><span class="pre">runctx</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cmd</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">globals</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">locals</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#profile.Profile.runctx" title="Link to this definition">¶</a></dt>
|
||
<dd><p>Profile the cmd via <a class="reference internal" href="../builtins/functions.html#exec" title="exec"><code class="xref py py-func docutils literal notranslate"><span class="pre">exec()</span></code></a> with the specified global and
|
||
local environment.</p>
|
||
</dd></dl>
|
||
|
||
<dl class="py method">
|
||
<dt class="sig sig-object py" id="profile.Profile.runcall">
|
||
<span class="sig-name descname"><span class="pre">runcall</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">func</span></span></em>, <em class="sig-param"><span class="positional-only-separator o"><abbr title="Positional-only parameter separator (PEP 570)"><span class="pre">/</span></abbr></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#profile.Profile.runcall" title="Link to this definition">¶</a></dt>
|
||
<dd><p>Profile <code class="docutils literal notranslate"><span class="pre">func(*args,</span> <span class="pre">**kwargs)</span></code></p>
|
||
</dd></dl>
|
||
|
||
</dd></dl>
|
||
|
||
<p>Note that profiling will only work if the called command/function actually
|
||
returns. If the interpreter is terminated (e.g. via a <a class="reference internal" href="sys.html#sys.exit" title="sys.exit"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.exit()</span></code></a> call
|
||
during the called command/function execution) no profiling results will be
|
||
printed.</p>
|
||
</section>
|
||
<section id="differences-from-profiling-tracing">
|
||
<h2>Differences from <code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code><a class="headerlink" href="#differences-from-profiling-tracing" title="Link to this heading">¶</a></h2>
|
||
<p>The <code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code> module differs from <a class="reference internal" href="profiling.tracing.html#module-profiling.tracing" title="profiling.tracing: Deterministic tracing profiler for Python programs."><code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code></a> in several
|
||
ways:</p>
|
||
<p><strong>Higher overhead.</strong> The pure Python implementation is significantly slower
|
||
than the C implementation, making it unsuitable for profiling long-running
|
||
programs or performance-sensitive code.</p>
|
||
<p><strong>Calibration support.</strong> The <code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code> module supports calibration to
|
||
compensate for profiling overhead. This is not needed in <a class="reference internal" href="profiling.tracing.html#module-profiling.tracing" title="profiling.tracing: Deterministic tracing profiler for Python programs."><code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code></a>
|
||
because the C implementation has negligible overhead.</p>
|
||
<p><strong>Custom timers.</strong> Both modules support custom timers, but <code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code>
|
||
accepts timer functions that return tuples (like <a class="reference internal" href="os.html#os.times" title="os.times"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.times()</span></code></a>), while
|
||
<a class="reference internal" href="profiling.tracing.html#module-profiling.tracing" title="profiling.tracing: Deterministic tracing profiler for Python programs."><code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code></a> requires a function returning a single number.</p>
|
||
<p><strong>Subclassing.</strong> The pure Python implementation is easier to subclass and
|
||
extend for custom profiling behavior.</p>
|
||
</section>
|
||
<section id="what-is-deterministic-profiling">
|
||
<span id="deterministic-profiling"></span><h2>What is deterministic profiling?<a class="headerlink" href="#what-is-deterministic-profiling" title="Link to this heading">¶</a></h2>
|
||
<p><em class="dfn">Deterministic profiling</em> is meant to reflect the fact that all <em>function
|
||
call</em>, <em>function return</em>, and <em>exception</em> events are monitored, and precise
|
||
timings are made for the intervals between these events (during which time the
|
||
user’s code is executing). In contrast, <em class="dfn">statistical profiling</em> (which is
|
||
provided by the <a class="reference internal" href="profiling.sampling.html#module-profiling.sampling" title="profiling.sampling: Statistical sampling profiler for Python processes."><code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.sampling</span></code></a> module) periodically samples the
|
||
effective instruction pointer, and deduces where time is being spent. The
|
||
latter technique traditionally involves less overhead (as the code does not
|
||
need to be instrumented), but provides only relative indications of where time
|
||
is being spent.</p>
|
||
<p>In Python, since there is an interpreter active during execution, the presence
|
||
of instrumented code is not required in order to do deterministic profiling.
|
||
Python automatically provides a <em class="dfn">hook</em> (optional callback) for each event.
|
||
In addition, the interpreted nature of Python tends to add so much overhead to
|
||
execution, that deterministic profiling tends to only add small processing
|
||
overhead in typical applications. The result is that deterministic profiling is
|
||
not that expensive, yet provides extensive run time statistics about the
|
||
execution of a Python program.</p>
|
||
<p>Call count statistics can be used to identify bugs in code (surprising counts),
|
||
and to identify possible inline-expansion points (high call counts). Internal
|
||
time statistics can be used to identify “hot loops” that should be carefully
|
||
optimized. Cumulative time statistics should be used to identify high level
|
||
errors in the selection of algorithms. Note that the unusual handling of
|
||
cumulative times in this profiler allows statistics for recursive
|
||
implementations of algorithms to be directly compared to iterative
|
||
implementations.</p>
|
||
</section>
|
||
<section id="limitations">
|
||
<span id="profile-limitations"></span><h2>Limitations<a class="headerlink" href="#limitations" title="Link to this heading">¶</a></h2>
|
||
<p>One limitation has to do with accuracy of timing information. There is a
|
||
fundamental problem with deterministic profilers involving accuracy. The most
|
||
obvious restriction is that the underlying “clock” is only ticking at a rate
|
||
(typically) of about .001 seconds. Hence no measurements will be more accurate
|
||
than the underlying clock. If enough measurements are taken, then the “error”
|
||
will tend to average out. Unfortunately, removing this first error induces a
|
||
second source of error.</p>
|
||
<p>The second problem is that it “takes a while” from when an event is dispatched
|
||
until the profiler’s call to get the time actually <em>gets</em> the state of the
|
||
clock. Similarly, there is a certain lag when exiting the profiler event
|
||
handler from the time that the clock’s value was obtained (and then squirreled
|
||
away), until the user’s code is once again executing. As a result, functions
|
||
that are called many times, or call many functions, will typically accumulate
|
||
this error. The error that accumulates in this fashion is typically less than
|
||
the accuracy of the clock (less than one clock tick), but it <em>can</em> accumulate
|
||
and become very significant.</p>
|
||
<p>The problem is more important with the deprecated <code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code> module than
|
||
with the lower-overhead <a class="reference internal" href="profiling.tracing.html#module-profiling.tracing" title="profiling.tracing: Deterministic tracing profiler for Python programs."><code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code></a>. For this reason,
|
||
<code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code> provides a means of calibrating itself for a given platform so
|
||
that this error can be probabilistically (on the average) removed. After the
|
||
profiler is calibrated, it will be more accurate (in a least square sense), but
|
||
it will sometimes produce negative numbers (when call counts are exceptionally
|
||
low, and the gods of probability work against you :-). ) Do <em>not</em> be alarmed
|
||
by negative numbers in the profile. They should <em>only</em> appear if you have
|
||
calibrated your profiler, and the results are actually better than without
|
||
calibration.</p>
|
||
</section>
|
||
<section id="calibration">
|
||
<span id="profile-calibration"></span><h2>Calibration<a class="headerlink" href="#calibration" title="Link to this heading">¶</a></h2>
|
||
<p>The profiler of the <code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code> module subtracts a constant from each event
|
||
handling time to compensate for the overhead of calling the time function, and
|
||
socking away the results. By default, the constant is 0. The following
|
||
procedure can be used to obtain a better constant for a given platform (see
|
||
<a class="reference internal" href="#profile-limitations"><span class="std std-ref">Limitations</span></a>).</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">profile</span>
|
||
<span class="n">pr</span> <span class="o">=</span> <span class="n">profile</span><span class="o">.</span><span class="n">Profile</span><span class="p">()</span>
|
||
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">):</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="n">pr</span><span class="o">.</span><span class="n">calibrate</span><span class="p">(</span><span class="mi">10000</span><span class="p">))</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>The method executes the number of Python calls given by the argument, directly
|
||
and again under the profiler, measuring the time for both. It then computes the
|
||
hidden overhead per profiler event, and returns that as a float. For example,
|
||
on a 1.8Ghz Intel Core i5 running macOS, and using Python’s time.process_time() as
|
||
the timer, the magical number is about 4.04e-6.</p>
|
||
<p>The object of this exercise is to get a fairly consistent result. If your
|
||
computer is <em>very</em> fast, or your timer function has poor resolution, you might
|
||
have to pass 100000, or even 1000000, to get consistent results.</p>
|
||
<p>When you have a consistent answer, there are three ways you can use it:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">profile</span>
|
||
|
||
<span class="c1"># 1. Apply computed bias to all Profile instances created hereafter.</span>
|
||
<span class="n">profile</span><span class="o">.</span><span class="n">Profile</span><span class="o">.</span><span class="n">bias</span> <span class="o">=</span> <span class="n">your_computed_bias</span>
|
||
|
||
<span class="c1"># 2. Apply computed bias to a specific Profile instance.</span>
|
||
<span class="n">pr</span> <span class="o">=</span> <span class="n">profile</span><span class="o">.</span><span class="n">Profile</span><span class="p">()</span>
|
||
<span class="n">pr</span><span class="o">.</span><span class="n">bias</span> <span class="o">=</span> <span class="n">your_computed_bias</span>
|
||
|
||
<span class="c1"># 3. Specify computed bias in instance constructor.</span>
|
||
<span class="n">pr</span> <span class="o">=</span> <span class="n">profile</span><span class="o">.</span><span class="n">Profile</span><span class="p">(</span><span class="n">bias</span><span class="o">=</span><span class="n">your_computed_bias</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>If you have a choice, you are better off choosing a smaller constant, and then
|
||
your results will “less often” show up as negative in profile statistics.</p>
|
||
</section>
|
||
<section id="using-a-custom-timer">
|
||
<span id="profile-timers"></span><h2>Using a custom timer<a class="headerlink" href="#using-a-custom-timer" title="Link to this heading">¶</a></h2>
|
||
<p>If you want to change how current time is determined (for example, to force use
|
||
of wall-clock time or elapsed process time), pass the timing function you want
|
||
to the <a class="reference internal" href="#profile.Profile" title="profile.Profile"><code class="xref py py-class docutils literal notranslate"><span class="pre">Profile</span></code></a> class constructor:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">pr</span> <span class="o">=</span> <span class="n">profile</span><span class="o">.</span><span class="n">Profile</span><span class="p">(</span><span class="n">your_time_func</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>The resulting profiler will then call <code class="docutils literal notranslate"><span class="pre">your_time_func</span></code>. Depending on whether
|
||
you are using <a class="reference internal" href="#profile.Profile" title="profile.Profile"><code class="xref py py-class docutils literal notranslate"><span class="pre">profile.Profile</span></code></a> or <a class="reference internal" href="profiling.tracing.html#profiling.tracing.Profile" title="profiling.tracing.Profile"><code class="xref py py-class docutils literal notranslate"><span class="pre">profiling.tracing.Profile</span></code></a>,
|
||
<code class="docutils literal notranslate"><span class="pre">your_time_func</span></code>’s return value will be interpreted differently:</p>
|
||
<dl>
|
||
<dt><a class="reference internal" href="#profile.Profile" title="profile.Profile"><code class="xref py py-class docutils literal notranslate"><span class="pre">profile.Profile</span></code></a></dt><dd><p><code class="docutils literal notranslate"><span class="pre">your_time_func</span></code> should return a single number, or a list of numbers whose
|
||
sum is the current time (like what <a class="reference internal" href="os.html#os.times" title="os.times"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.times()</span></code></a> returns). If the
|
||
function returns a single time number, or the list of returned numbers has
|
||
length 2, then you will get an especially fast version of the dispatch
|
||
routine.</p>
|
||
<p>Be warned that you should calibrate the profiler class for the timer function
|
||
that you choose (see <a class="reference internal" href="#profile-calibration"><span class="std std-ref">Calibration</span></a>). For most machines, a timer
|
||
that returns a lone integer value will provide the best results in terms of
|
||
low overhead during profiling. (<a class="reference internal" href="os.html#os.times" title="os.times"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.times()</span></code></a> is <em>pretty</em> bad, as it
|
||
returns a tuple of floating-point values). If you want to substitute a
|
||
better timer in the cleanest fashion, derive a class and hardwire a
|
||
replacement dispatch method that best handles your timer call, along with the
|
||
appropriate calibration constant.</p>
|
||
</dd>
|
||
<dt><a class="reference internal" href="profiling.tracing.html#profiling.tracing.Profile" title="profiling.tracing.Profile"><code class="xref py py-class docutils literal notranslate"><span class="pre">profiling.tracing.Profile</span></code></a></dt><dd><p><code class="docutils literal notranslate"><span class="pre">your_time_func</span></code> should return a single number. If it returns integers,
|
||
you can also invoke the class constructor with a second argument specifying
|
||
the real duration of one unit of time. For example, if
|
||
<code class="docutils literal notranslate"><span class="pre">your_integer_time_func</span></code> returns times measured in thousands of seconds,
|
||
you would construct the <a class="reference internal" href="#profile.Profile" title="profile.Profile"><code class="xref py py-class docutils literal notranslate"><span class="pre">Profile</span></code></a> instance as follows:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">pr</span> <span class="o">=</span> <span class="n">profiling</span><span class="o">.</span><span class="n">tracing</span><span class="o">.</span><span class="n">Profile</span><span class="p">(</span><span class="n">your_integer_time_func</span><span class="p">,</span> <span class="mf">0.001</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>As the <a class="reference internal" href="profiling.tracing.html#profiling.tracing.Profile" title="profiling.tracing.Profile"><code class="xref py py-class docutils literal notranslate"><span class="pre">profiling.tracing.Profile</span></code></a> class cannot be calibrated, custom
|
||
timer functions should be used with care and should be as fast as possible.
|
||
For the best results with a custom timer, it might be necessary to hard-code
|
||
it in the C source of the internal <code class="xref py py-mod docutils literal notranslate"><span class="pre">_lsprof</span></code> module.</p>
|
||
</dd>
|
||
</dl>
|
||
<p>Python 3.3 adds several new functions in <a class="reference internal" href="time.html#module-time" title="time: Time access and conversions."><code class="xref py py-mod docutils literal notranslate"><span class="pre">time</span></code></a> that can be used to make
|
||
precise measurements of process or wall-clock time. For example, see
|
||
<a class="reference internal" href="time.html#time.perf_counter" title="time.perf_counter"><code class="xref py py-func docutils literal notranslate"><span class="pre">time.perf_counter()</span></code></a>.</p>
|
||
<div class="admonition seealso">
|
||
<p class="admonition-title">See also</p>
|
||
<dl class="simple">
|
||
<dt><a class="reference internal" href="profiling.html#module-profiling" title="profiling: Python profiling tools for performance analysis."><code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling</span></code></a></dt><dd><p>Overview of Python profiling tools.</p>
|
||
</dd>
|
||
<dt><a class="reference internal" href="profiling.tracing.html#module-profiling.tracing" title="profiling.tracing: Deterministic tracing profiler for Python programs."><code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code></a></dt><dd><p>Recommended replacement for this module.</p>
|
||
</dd>
|
||
<dt><a class="reference internal" href="pstats.html#module-pstats" title="pstats: Statistics object for analyzing profiler output."><code class="xref py py-mod docutils literal notranslate"><span class="pre">pstats</span></code></a></dt><dd><p>Statistical analysis and formatting for profile data.</p>
|
||
</dd>
|
||
</dl>
|
||
</div>
|
||
</section>
|
||
</section>
|
||
|
||
|
||
<div class="clearer"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sphinxsidebar" role="navigation" aria-label="Main">
|
||
<div class="sphinxsidebarwrapper">
|
||
<div>
|
||
<h3><a href="../contents.html">Table of Contents</a></h3>
|
||
<ul>
|
||
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code> — Pure Python profiler</a><ul>
|
||
<li><a class="reference internal" href="#migration">Migration</a></li>
|
||
<li><a class="reference internal" href="#profile-and-profiling-tracing-module-reference"><code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code> and <code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code> module reference</a></li>
|
||
<li><a class="reference internal" href="#differences-from-profiling-tracing">Differences from <code class="xref py py-mod docutils literal notranslate"><span class="pre">profiling.tracing</span></code></a></li>
|
||
<li><a class="reference internal" href="#what-is-deterministic-profiling">What is deterministic profiling?</a></li>
|
||
<li><a class="reference internal" href="#limitations">Limitations</a></li>
|
||
<li><a class="reference internal" href="#calibration">Calibration</a></li>
|
||
<li><a class="reference internal" href="#using-a-custom-timer">Using a custom timer</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
|
||
</div>
|
||
<div>
|
||
<h4>Previous topic</h4>
|
||
<p class="topless"><a href="getopt.html"
|
||
title="previous chapter"><code class="xref py py-mod docutils literal notranslate"><span class="pre">getopt</span></code> — C-style parser for command line options</a></p>
|
||
</div>
|
||
<div>
|
||
<h4>Next topic</h4>
|
||
<p class="topless"><a href="removed.html"
|
||
title="next chapter">Removed Modules</a></p>
|
||
</div>
|
||
<script>
|
||
document.addEventListener('DOMContentLoaded', () => {
|
||
const title = document.querySelector('meta[property="og:title"]').content;
|
||
const elements = document.querySelectorAll('.improvepage');
|
||
const pageurl = window.location.href.split('?')[0];
|
||
elements.forEach(element => {
|
||
const url = new URL(element.href.split('?')[0].replace("-nojs", ""));
|
||
url.searchParams.set('pagetitle', title);
|
||
url.searchParams.set('pageurl', pageurl);
|
||
url.searchParams.set('pagesource', "library/profile.rst");
|
||
element.href = url.toString();
|
||
});
|
||
});
|
||
</script>
|
||
<div role="note" aria-label="source link">
|
||
<h3>This page</h3>
|
||
<ul class="this-page-menu">
|
||
<li><a href="../bugs.html">Report a bug</a></li>
|
||
<li><a class="improvepage" href="../improve-page-nojs.html">Improve this page</a></li>
|
||
<li>
|
||
<a href="https://github.com/python/cpython/blob/3.15/Doc/library/profile.rst?plain=1"
|
||
rel="nofollow">Show source
|
||
</a>
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<div id="sidebarbutton" title="Collapse sidebar">
|
||
<span>«</span>
|
||
</div>
|
||
|
||
</div>
|
||
<div class="clearer"></div>
|
||
</div>
|
||
<div class="related" role="navigation" aria-label="Related">
|
||
<h3>Navigation</h3>
|
||
<ul>
|
||
<li class="right" style="margin-right: 10px">
|
||
<a href="../genindex.html" title="General Index"
|
||
>index</a></li>
|
||
<li class="right" >
|
||
<a href="../py-modindex.html" title="Python Module Index"
|
||
>modules</a> |</li>
|
||
<li class="right" >
|
||
<a href="removed.html" title="Removed Modules"
|
||
>next</a> |</li>
|
||
<li class="right" >
|
||
<a href="getopt.html" title="getopt — C-style parser for command line options"
|
||
>previous</a> |</li>
|
||
|
||
<li class="root-icon"><img src="../_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"></li>
|
||
<li><a href="https://www.python.org/">Python</a> »</li>
|
||
<li class="switchers">
|
||
<div class="language_switcher_placeholder"></div>
|
||
<div class="version_switcher_placeholder"></div>
|
||
</li>
|
||
<li>
|
||
|
||
</li>
|
||
<li id="cpython-language-and-version">
|
||
<a href="../index.html">3.15.0 Documentation</a> »
|
||
</li>
|
||
|
||
<li class="nav-item nav-item-1"><a href="index.html" >The Python standard library</a> »</li>
|
||
<li class="nav-item nav-item-2"><a href="superseded.html" >Superseded modules</a> »</li>
|
||
<li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">profile</span></code> — Pure Python profiler</a></li>
|
||
<li class="right">
|
||
|
||
|
||
<div class="inline-search" role="search">
|
||
<form class="inline-search" action="../search.html" method="get">
|
||
<input placeholder="Quick search" aria-label="Quick search" type="search" name="q" id="search-box">
|
||
<input type="submit" value="Go">
|
||
</form>
|
||
</div>
|
||
|
|
||
</li>
|
||
<li class="right">
|
||
<label class="theme-selector-label">
|
||
Theme
|
||
<select class="theme-selector" oninput="activateTheme(this.value)">
|
||
<option value="auto" selected>Auto</option>
|
||
<option value="light">Light</option>
|
||
<option value="dark">Dark</option>
|
||
</select>
|
||
</label> |</li>
|
||
|
||
</ul>
|
||
</div>
|
||
<div class="footer">
|
||
© <a href="../copyright.html">Copyright</a> 2001 Python Software Foundation.
|
||
<br>
|
||
This page is licensed under the Python Software Foundation License Version 2.
|
||
<br>
|
||
Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
|
||
<br>
|
||
|
||
See <a href="/license.html">History and License</a> for more information.<br>
|
||
|
||
|
||
<br>
|
||
|
||
The Python Software Foundation is a non-profit corporation.
|
||
<a href="https://www.python.org/psf/donations/">Please donate.</a>
|
||
<br>
|
||
<br>
|
||
Last updated on Oct 09, 2026 (11:35 UTC).
|
||
|
||
<a href="/bugs.html">Found a bug</a>?
|
||
|
||
<br>
|
||
|
||
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
|
||
</div>
|
||
|
||
</body>
|
||
</html> |