uTools-Manuals/docs/python/tracemalloc.html
2019-04-21 11:50:48 +08:00

162 lines
86 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="body" role="main"><div class="section" id="module-tracemalloc"><h1><span class="yiyi-st" id="yiyi-10">27.7. <a class="reference internal" href="#module-tracemalloc" title="tracemalloc: Trace memory allocations."><code class="xref py py-mod docutils literal"><span class="pre">tracemalloc</span></code></a> - 跟踪内存分配</span></h1><div class="versionadded"><p><span class="yiyi-st" id="yiyi-11"><span class="versionmodified">版本3.4中的新功能。</span></span></p></div><p><span class="yiyi-st" id="yiyi-12"><strong>源代码:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/tracemalloc.py">Lib / tracemalloc.py</a></span></p><p><span class="yiyi-st" id="yiyi-13">tracemalloc模块是一个跟踪由Python分配的内存块的调试工具。</span><span class="yiyi-st" id="yiyi-14">它提供以下信息:</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-15">跟踪分配对象的位置</span></li><li><span class="yiyi-st" id="yiyi-16">每个文件名和每行编号分配的内存块的统计信息:已分配内存块的总大小,数量和平均大小</span></li><li><span class="yiyi-st" id="yiyi-17">计算两个快照之间的差异以检测内存泄漏</span></li></ul><p><span class="yiyi-st" id="yiyi-18">To trace most memory blocks allocated by Python, the module should be started as early as possible by setting the <span class="target" id="index-0"></span><a class="reference internal" href="../using/cmdline.html#envvar-PYTHONTRACEMALLOC"><code class="xref std std-envvar docutils literal"><span class="pre">PYTHONTRACEMALLOC</span></code></a> environment variable to <code class="docutils literal"><span class="pre">1</span></code>, or by using <a class="reference internal" href="../using/cmdline.html#cmdoption-X"><code class="xref std std-option docutils literal"><span class="pre">-X</span></code></a> <code class="docutils literal"><span class="pre">tracemalloc</span></code> command line option. </span><span class="yiyi-st" id="yiyi-19">可以在运行时调用<a class="reference internal" href="#tracemalloc.start" title="tracemalloc.start"><code class="xref py py-func docutils literal"><span class="pre">tracemalloc.start()</span></code></a>函数以开始跟踪Python内存分配。</span></p><p><span class="yiyi-st" id="yiyi-20">默认情况下分配的内存块的跟踪只存储最近的帧1帧</span><span class="yiyi-st" id="yiyi-21">要在启动时存储25帧<span class="target" id="index-1"></span> <a class="reference internal" href="../using/cmdline.html#envvar-PYTHONTRACEMALLOC"><code class="xref std std-envvar docutils literal"><span class="pre">PYTHONTRACEMALLOC</span></code></a>环境变量设置为<code class="docutils literal"><span class="pre">25</span></code>,或使用<a class="reference internal" href="../using/cmdline.html#cmdoption-X"><code class="xref std std-option docutils literal"><span class="pre">-X</span></code></a> <code class="docutils literal"><span class="pre">tracemalloc=25</span></code>命令行选项。</span></p><div class="section" id="examples"><h2><span class="yiyi-st" id="yiyi-22">27.7.1. </span><span class="yiyi-st" id="yiyi-23">Examples</span></h2><div class="section" id="display-the-top-10"><h3><span class="yiyi-st" id="yiyi-24">27.7.1.1. </span><span class="yiyi-st" id="yiyi-25">Display the top 10</span></h3><p><span class="yiyi-st" id="yiyi-26">显示分配最多内存的10个文件</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">tracemalloc</span>
<span class="n">tracemalloc</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="c1"># ... run your application ...</span>
<span class="n">snapshot</span> <span class="o">=</span> <span class="n">tracemalloc</span><span class="o">.</span><span class="n">take_snapshot</span><span class="p">()</span>
<span class="n">top_stats</span> <span class="o">=</span> <span class="n">snapshot</span><span class="o">.</span><span class="n">statistics</span><span class="p">(</span><span class="s1">'lineno'</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"[ Top 10 ]"</span><span class="p">)</span>
<span class="k">for</span> <span class="n">stat</span> <span class="ow">in</span> <span class="n">top_stats</span><span class="p">[:</span><span class="mi">10</span><span class="p">]:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">stat</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-27">Python测试套件的输出示例</span></p><pre><code class="language-python"><span></span><span class="p">[</span> <span class="n">Top</span> <span class="mi">10</span> <span class="p">]</span>
<span class="o">&lt;</span><span class="n">frozen</span> <span class="n">importlib</span><span class="o">.</span><span class="n">_bootstrap</span><span class="o">&gt;</span><span class="p">:</span><span class="mi">716</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mi">4855</span> <span class="n">KiB</span><span class="p">,</span> <span class="n">count</span><span class="o">=</span><span class="mi">39328</span><span class="p">,</span> <span class="n">average</span><span class="o">=</span><span class="mi">126</span> <span class="n">B</span>
<span class="o">&lt;</span><span class="n">frozen</span> <span class="n">importlib</span><span class="o">.</span><span class="n">_bootstrap</span><span class="o">&gt;</span><span class="p">:</span><span class="mi">284</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mi">521</span> <span class="n">KiB</span><span class="p">,</span> <span class="n">count</span><span class="o">=</span><span class="mi">3199</span><span class="p">,</span> <span class="n">average</span><span class="o">=</span><span class="mi">167</span> <span class="n">B</span>
<span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">python3</span><span class="o">.</span><span class="mi">4</span><span class="o">/</span><span class="n">collections</span><span class="o">/</span><span class="n">__init__</span><span class="o">.</span><span class="n">py</span><span class="p">:</span><span class="mi">368</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mi">244</span> <span class="n">KiB</span><span class="p">,</span> <span class="n">count</span><span class="o">=</span><span class="mi">2315</span><span class="p">,</span> <span class="n">average</span><span class="o">=</span><span class="mi">108</span> <span class="n">B</span>
<span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">python3</span><span class="o">.</span><span class="mi">4</span><span class="o">/</span><span class="n">unittest</span><span class="o">/</span><span class="n">case</span><span class="o">.</span><span class="n">py</span><span class="p">:</span><span class="mi">381</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mi">185</span> <span class="n">KiB</span><span class="p">,</span> <span class="n">count</span><span class="o">=</span><span class="mi">779</span><span class="p">,</span> <span class="n">average</span><span class="o">=</span><span class="mi">243</span> <span class="n">B</span>
<span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">python3</span><span class="o">.</span><span class="mi">4</span><span class="o">/</span><span class="n">unittest</span><span class="o">/</span><span class="n">case</span><span class="o">.</span><span class="n">py</span><span class="p">:</span><span class="mi">402</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mi">154</span> <span class="n">KiB</span><span class="p">,</span> <span class="n">count</span><span class="o">=</span><span class="mi">378</span><span class="p">,</span> <span class="n">average</span><span class="o">=</span><span class="mi">416</span> <span class="n">B</span>
<span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">python3</span><span class="o">.</span><span class="mi">4</span><span class="o">/</span><span class="n">abc</span><span class="o">.</span><span class="n">py</span><span class="p">:</span><span class="mi">133</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mf">88.7</span> <span class="n">KiB</span><span class="p">,</span> <span class="n">count</span><span class="o">=</span><span class="mi">347</span><span class="p">,</span> <span class="n">average</span><span class="o">=</span><span class="mi">262</span> <span class="n">B</span>
<span class="o">&lt;</span><span class="n">frozen</span> <span class="n">importlib</span><span class="o">.</span><span class="n">_bootstrap</span><span class="o">&gt;</span><span class="p">:</span><span class="mi">1446</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mf">70.4</span> <span class="n">KiB</span><span class="p">,</span> <span class="n">count</span><span class="o">=</span><span class="mi">911</span><span class="p">,</span> <span class="n">average</span><span class="o">=</span><span class="mi">79</span> <span class="n">B</span>
<span class="o">&lt;</span><span class="n">frozen</span> <span class="n">importlib</span><span class="o">.</span><span class="n">_bootstrap</span><span class="o">&gt;</span><span class="p">:</span><span class="mi">1454</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mf">52.0</span> <span class="n">KiB</span><span class="p">,</span> <span class="n">count</span><span class="o">=</span><span class="mi">25</span><span class="p">,</span> <span class="n">average</span><span class="o">=</span><span class="mi">2131</span> <span class="n">B</span>
<span class="o">&lt;</span><span class="n">string</span><span class="o">&gt;</span><span class="p">:</span><span class="mi">5</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mf">49.7</span> <span class="n">KiB</span><span class="p">,</span> <span class="n">count</span><span class="o">=</span><span class="mi">148</span><span class="p">,</span> <span class="n">average</span><span class="o">=</span><span class="mi">344</span> <span class="n">B</span>
<span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">python3</span><span class="o">.</span><span class="mi">4</span><span class="o">/</span><span class="n">sysconfig</span><span class="o">.</span><span class="n">py</span><span class="p">:</span><span class="mi">411</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mf">48.0</span> <span class="n">KiB</span><span class="p">,</span> <span class="n">count</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">average</span><span class="o">=</span><span class="mf">48.0</span> <span class="n">KiB</span>
</code></pre><p><span class="yiyi-st" id="yiyi-28">我们可以看到Python从模块加载了<code class="docutils literal"><span class="pre">4.8</span> <span class="pre">MiB</span></code>数据(字节码和常量),并且分配了<a class="reference internal" href="collections.html#module-collections" title="collections: Container datatypes"><code class="xref py py-mod docutils literal"><span class="pre">collections</span></code></a>模块<code class="docutils literal"><span class="pre">244</span> <span class="pre">KiB</span></code>建立<a class="reference internal" href="collections.html#collections.namedtuple" title="collections.namedtuple"><code class="xref py py-class docutils literal"><span class="pre">namedtuple</span></code></a>类型。</span></p><p><span class="yiyi-st" id="yiyi-29">有关更多选项,请参见<a class="reference internal" href="#tracemalloc.Snapshot.statistics" title="tracemalloc.Snapshot.statistics"><code class="xref py py-meth docutils literal"><span class="pre">Snapshot.statistics()</span></code></a></span></p></div><div class="section" id="compute-differences"><h3><span class="yiyi-st" id="yiyi-30">27.7.1.2. </span><span class="yiyi-st" id="yiyi-31">Compute differences</span></h3><p><span class="yiyi-st" id="yiyi-32">拍摄两张快照并显示差异:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">tracemalloc</span>
<span class="n">tracemalloc</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="c1"># ... start your application ...</span>
<span class="n">snapshot1</span> <span class="o">=</span> <span class="n">tracemalloc</span><span class="o">.</span><span class="n">take_snapshot</span><span class="p">()</span>
<span class="c1"># ... call the function leaking memory ...</span>
<span class="n">snapshot2</span> <span class="o">=</span> <span class="n">tracemalloc</span><span class="o">.</span><span class="n">take_snapshot</span><span class="p">()</span>
<span class="n">top_stats</span> <span class="o">=</span> <span class="n">snapshot2</span><span class="o">.</span><span class="n">compare_to</span><span class="p">(</span><span class="n">snapshot1</span><span class="p">,</span> <span class="s1">'lineno'</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"[ Top 10 differences ]"</span><span class="p">)</span>
<span class="k">for</span> <span class="n">stat</span> <span class="ow">in</span> <span class="n">top_stats</span><span class="p">[:</span><span class="mi">10</span><span class="p">]:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">stat</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-33">运行Python测试套件的一些测试之前/之后的输出示例:</span></p><pre><code class="language-python"><span></span><span class="p">[</span> <span class="n">Top</span> <span class="mi">10</span> <span class="n">differences</span> <span class="p">]</span>
<span class="o">&lt;</span><span class="n">frozen</span> <span class="n">importlib</span><span class="o">.</span><span class="n">_bootstrap</span><span class="o">&gt;</span><span class="p">:</span><span class="mi">716</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mi">8173</span> <span class="n">KiB</span> <span class="p">(</span><span class="o">+</span><span class="mi">4428</span> <span class="n">KiB</span><span class="p">),</span> <span class="n">count</span><span class="o">=</span><span class="mi">71332</span> <span class="p">(</span><span class="o">+</span><span class="mi">39369</span><span class="p">),</span> <span class="n">average</span><span class="o">=</span><span class="mi">117</span> <span class="n">B</span>
<span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">python3</span><span class="o">.</span><span class="mi">4</span><span class="o">/</span><span class="n">linecache</span><span class="o">.</span><span class="n">py</span><span class="p">:</span><span class="mi">127</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mi">940</span> <span class="n">KiB</span> <span class="p">(</span><span class="o">+</span><span class="mi">940</span> <span class="n">KiB</span><span class="p">),</span> <span class="n">count</span><span class="o">=</span><span class="mi">8106</span> <span class="p">(</span><span class="o">+</span><span class="mi">8106</span><span class="p">),</span> <span class="n">average</span><span class="o">=</span><span class="mi">119</span> <span class="n">B</span>
<span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">python3</span><span class="o">.</span><span class="mi">4</span><span class="o">/</span><span class="n">unittest</span><span class="o">/</span><span class="n">case</span><span class="o">.</span><span class="n">py</span><span class="p">:</span><span class="mi">571</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mi">298</span> <span class="n">KiB</span> <span class="p">(</span><span class="o">+</span><span class="mi">298</span> <span class="n">KiB</span><span class="p">),</span> <span class="n">count</span><span class="o">=</span><span class="mi">589</span> <span class="p">(</span><span class="o">+</span><span class="mi">589</span><span class="p">),</span> <span class="n">average</span><span class="o">=</span><span class="mi">519</span> <span class="n">B</span>
<span class="o">&lt;</span><span class="n">frozen</span> <span class="n">importlib</span><span class="o">.</span><span class="n">_bootstrap</span><span class="o">&gt;</span><span class="p">:</span><span class="mi">284</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mi">1005</span> <span class="n">KiB</span> <span class="p">(</span><span class="o">+</span><span class="mi">166</span> <span class="n">KiB</span><span class="p">),</span> <span class="n">count</span><span class="o">=</span><span class="mi">7423</span> <span class="p">(</span><span class="o">+</span><span class="mi">1526</span><span class="p">),</span> <span class="n">average</span><span class="o">=</span><span class="mi">139</span> <span class="n">B</span>
<span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">python3</span><span class="o">.</span><span class="mi">4</span><span class="o">/</span><span class="n">mimetypes</span><span class="o">.</span><span class="n">py</span><span class="p">:</span><span class="mi">217</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mi">112</span> <span class="n">KiB</span> <span class="p">(</span><span class="o">+</span><span class="mi">112</span> <span class="n">KiB</span><span class="p">),</span> <span class="n">count</span><span class="o">=</span><span class="mi">1334</span> <span class="p">(</span><span class="o">+</span><span class="mi">1334</span><span class="p">),</span> <span class="n">average</span><span class="o">=</span><span class="mi">86</span> <span class="n">B</span>
<span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">python3</span><span class="o">.</span><span class="mi">4</span><span class="o">/</span><span class="n">http</span><span class="o">/</span><span class="n">server</span><span class="o">.</span><span class="n">py</span><span class="p">:</span><span class="mi">848</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mf">96.0</span> <span class="n">KiB</span> <span class="p">(</span><span class="o">+</span><span class="mf">96.0</span> <span class="n">KiB</span><span class="p">),</span> <span class="n">count</span><span class="o">=</span><span class="mi">1</span> <span class="p">(</span><span class="o">+</span><span class="mi">1</span><span class="p">),</span> <span class="n">average</span><span class="o">=</span><span class="mf">96.0</span> <span class="n">KiB</span>
<span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">python3</span><span class="o">.</span><span class="mi">4</span><span class="o">/</span><span class="n">inspect</span><span class="o">.</span><span class="n">py</span><span class="p">:</span><span class="mi">1465</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mf">83.5</span> <span class="n">KiB</span> <span class="p">(</span><span class="o">+</span><span class="mf">83.5</span> <span class="n">KiB</span><span class="p">),</span> <span class="n">count</span><span class="o">=</span><span class="mi">109</span> <span class="p">(</span><span class="o">+</span><span class="mi">109</span><span class="p">),</span> <span class="n">average</span><span class="o">=</span><span class="mi">784</span> <span class="n">B</span>
<span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">python3</span><span class="o">.</span><span class="mi">4</span><span class="o">/</span><span class="n">unittest</span><span class="o">/</span><span class="n">mock</span><span class="o">.</span><span class="n">py</span><span class="p">:</span><span class="mi">491</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mf">77.7</span> <span class="n">KiB</span> <span class="p">(</span><span class="o">+</span><span class="mf">77.7</span> <span class="n">KiB</span><span class="p">),</span> <span class="n">count</span><span class="o">=</span><span class="mi">143</span> <span class="p">(</span><span class="o">+</span><span class="mi">143</span><span class="p">),</span> <span class="n">average</span><span class="o">=</span><span class="mi">557</span> <span class="n">B</span>
<span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">python3</span><span class="o">.</span><span class="mi">4</span><span class="o">/</span><span class="n">urllib</span><span class="o">/</span><span class="n">parse</span><span class="o">.</span><span class="n">py</span><span class="p">:</span><span class="mi">476</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mf">71.8</span> <span class="n">KiB</span> <span class="p">(</span><span class="o">+</span><span class="mf">71.8</span> <span class="n">KiB</span><span class="p">),</span> <span class="n">count</span><span class="o">=</span><span class="mi">969</span> <span class="p">(</span><span class="o">+</span><span class="mi">969</span><span class="p">),</span> <span class="n">average</span><span class="o">=</span><span class="mi">76</span> <span class="n">B</span>
<span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">python3</span><span class="o">.</span><span class="mi">4</span><span class="o">/</span><span class="n">contextlib</span><span class="o">.</span><span class="n">py</span><span class="p">:</span><span class="mi">38</span><span class="p">:</span> <span class="n">size</span><span class="o">=</span><span class="mf">67.2</span> <span class="n">KiB</span> <span class="p">(</span><span class="o">+</span><span class="mf">67.2</span> <span class="n">KiB</span><span class="p">),</span> <span class="n">count</span><span class="o">=</span><span class="mi">126</span> <span class="p">(</span><span class="o">+</span><span class="mi">126</span><span class="p">),</span> <span class="n">average</span><span class="o">=</span><span class="mi">546</span> <span class="n">B</span>
</code></pre><p><span class="yiyi-st" id="yiyi-34">我们可以看到Python已经加载了模块数据字节码和常量<code class="docutils literal"><span class="pre">8.2</span> <span class="pre">MiB</span></code>,这是<code class="docutils literal"><span class="pre">4.4 </span> <span class="pre">MiB</span></code>超过在测试之前加载的时间。</span><span class="yiyi-st" id="yiyi-35">Similarly, the <a class="reference internal" href="linecache.html#module-linecache" title="linecache: This module provides random access to individual lines from text files."><code class="xref py py-mod docutils literal"><span class="pre">linecache</span></code></a> module has cached <code class="docutils literal"><span class="pre">940</span> <span class="pre">KiB</span></code> of Python source code to format tracebacks, all of it since the previous snapshot.</span></p><p><span class="yiyi-st" id="yiyi-36">如果系统具有很少的可用内存,可以使用<a class="reference internal" href="#tracemalloc.Snapshot.dump" title="tracemalloc.Snapshot.dump"><code class="xref py py-meth docutils literal"><span class="pre">Snapshot.dump()</span></code></a>方法将快照写入磁盘,以便离线分析快照。</span><span class="yiyi-st" id="yiyi-37">然后使用<a class="reference internal" href="#tracemalloc.Snapshot.load" title="tracemalloc.Snapshot.load"><code class="xref py py-meth docutils literal"><span class="pre">Snapshot.load()</span></code></a>方法重新载入快照。</span></p></div><div class="section" id="get-the-traceback-of-a-memory-block"><h3><span class="yiyi-st" id="yiyi-38">27.7.1.3. </span><span class="yiyi-st" id="yiyi-39">Get the traceback of a memory block</span></h3><p><span class="yiyi-st" id="yiyi-40">显示最大内存块回溯的代码:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">tracemalloc</span>
<span class="c1"># Store 25 frames</span>
<span class="n">tracemalloc</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="mi">25</span><span class="p">)</span>
<span class="c1"># ... run your application ...</span>
<span class="n">snapshot</span> <span class="o">=</span> <span class="n">tracemalloc</span><span class="o">.</span><span class="n">take_snapshot</span><span class="p">()</span>
<span class="n">top_stats</span> <span class="o">=</span> <span class="n">snapshot</span><span class="o">.</span><span class="n">statistics</span><span class="p">(</span><span class="s1">'traceback'</span><span class="p">)</span>
<span class="c1"># pick the biggest memory block</span>
<span class="n">stat</span> <span class="o">=</span> <span class="n">top_stats</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2"> memory blocks: </span><span class="si">%.1f</span><span class="s2"> KiB"</span> <span class="o">%</span> <span class="p">(</span><span class="n">stat</span><span class="o">.</span><span class="n">count</span><span class="p">,</span> <span class="n">stat</span><span class="o">.</span><span class="n">size</span> <span class="o">/</span> <span class="mi">1024</span><span class="p">))</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">stat</span><span class="o">.</span><span class="n">traceback</span><span class="o">.</span><span class="n">format</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-41">Python测试套件的输出示例回溯限制为25帧</span></p><pre><code class="language-python"><span></span><span class="mi">903</span> <span class="n">memory</span> <span class="n">blocks</span><span class="p">:</span> <span class="mf">870.1</span> <span class="n">KiB</span>
<span class="n">File</span> <span class="s2">"&lt;frozen importlib._bootstrap&gt;"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">716</span>
<span class="n">File</span> <span class="s2">"&lt;frozen importlib._bootstrap&gt;"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1036</span>
<span class="n">File</span> <span class="s2">"&lt;frozen importlib._bootstrap&gt;"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">934</span>
<span class="n">File</span> <span class="s2">"&lt;frozen importlib._bootstrap&gt;"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1068</span>
<span class="n">File</span> <span class="s2">"&lt;frozen importlib._bootstrap&gt;"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">619</span>
<span class="n">File</span> <span class="s2">"&lt;frozen importlib._bootstrap&gt;"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1581</span>
<span class="n">File</span> <span class="s2">"&lt;frozen importlib._bootstrap&gt;"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1614</span>
<span class="n">File</span> <span class="s2">"/usr/lib/python3.4/doctest.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">101</span>
<span class="kn">import</span> <span class="nn">pdb</span>
<span class="n">File</span> <span class="s2">"&lt;frozen importlib._bootstrap&gt;"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">284</span>
<span class="n">File</span> <span class="s2">"&lt;frozen importlib._bootstrap&gt;"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">938</span>
<span class="n">File</span> <span class="s2">"&lt;frozen importlib._bootstrap&gt;"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1068</span>
<span class="n">File</span> <span class="s2">"&lt;frozen importlib._bootstrap&gt;"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">619</span>
<span class="n">File</span> <span class="s2">"&lt;frozen importlib._bootstrap&gt;"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1581</span>
<span class="n">File</span> <span class="s2">"&lt;frozen importlib._bootstrap&gt;"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1614</span>
<span class="n">File</span> <span class="s2">"/usr/lib/python3.4/test/support/__init__.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1728</span>
<span class="kn">import</span> <span class="nn">doctest</span>
<span class="n">File</span> <span class="s2">"/usr/lib/python3.4/test/test_pickletools.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">21</span>
<span class="n">support</span><span class="o">.</span><span class="n">run_doctest</span><span class="p">(</span><span class="n">pickletools</span><span class="p">)</span>
<span class="n">File</span> <span class="s2">"/usr/lib/python3.4/test/regrtest.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1276</span>
<span class="n">test_runner</span><span class="p">()</span>
<span class="n">File</span> <span class="s2">"/usr/lib/python3.4/test/regrtest.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">976</span>
<span class="n">display_failure</span><span class="o">=</span><span class="ow">not</span> <span class="n">verbose</span><span class="p">)</span>
<span class="n">File</span> <span class="s2">"/usr/lib/python3.4/test/regrtest.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">761</span>
<span class="n">match_tests</span><span class="o">=</span><span class="n">ns</span><span class="o">.</span><span class="n">match_tests</span><span class="p">)</span>
<span class="n">File</span> <span class="s2">"/usr/lib/python3.4/test/regrtest.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1563</span>
<span class="n">main</span><span class="p">()</span>
<span class="n">File</span> <span class="s2">"/usr/lib/python3.4/test/__main__.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">3</span>
<span class="n">regrtest</span><span class="o">.</span><span class="n">main_in_temp_cwd</span><span class="p">()</span>
<span class="n">File</span> <span class="s2">"/usr/lib/python3.4/runpy.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">73</span>
<span class="n">exec</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="n">run_globals</span><span class="p">)</span>
<span class="n">File</span> <span class="s2">"/usr/lib/python3.4/runpy.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">160</span>
<span class="s2">"__main__"</span><span class="p">,</span> <span class="n">fname</span><span class="p">,</span> <span class="n">loader</span><span class="p">,</span> <span class="n">pkg_name</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-42">我们可以看到,在<a class="reference internal" href="importlib.html#module-importlib" title="importlib: The implementation of the import machinery."><code class="xref py py-mod docutils literal"><span class="pre">importlib</span></code></a>模块中分配了最多的内存,以从模块加载数据(字节码和常量):<code class="docutils literal"><span class="pre">870</span> <span class="pre">KiB</span> </code></span><span class="yiyi-st" id="yiyi-43">The traceback is where the <a class="reference internal" href="importlib.html#module-importlib" title="importlib: The implementation of the import machinery."><code class="xref py py-mod docutils literal"><span class="pre">importlib</span></code></a> loaded data most recently: on the <code class="docutils literal"><span class="pre">import</span> <span class="pre">pdb</span></code> line of the <a class="reference internal" href="doctest.html#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal"><span class="pre">doctest</span></code></a> module. </span><span class="yiyi-st" id="yiyi-44">如果加载了新模块,回溯可能会更改。</span></p></div><div class="section" id="pretty-top"><h3><span class="yiyi-st" id="yiyi-45">27.7.1.4. </span><span class="yiyi-st" id="yiyi-46">Pretty top</span></h3><p><span class="yiyi-st" id="yiyi-47">忽略<code class="docutils literal"><span class="pre">lt frozen</span> <span class="pre">importlib._bootstrapgt</span></code><code class="docutils literal"><span class="pre">&lt;unknown&gt;</span></code>文件:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">linecache</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">tracemalloc</span>
<span class="k">def</span> <span class="nf">display_top</span><span class="p">(</span><span class="n">snapshot</span><span class="p">,</span> <span class="n">group_by</span><span class="o">=</span><span class="s1">'lineno'</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="mi">10</span><span class="p">):</span>
<span class="n">snapshot</span> <span class="o">=</span> <span class="n">snapshot</span><span class="o">.</span><span class="n">filter_traces</span><span class="p">((</span>
<span class="n">tracemalloc</span><span class="o">.</span><span class="n">Filter</span><span class="p">(</span><span class="kc">False</span><span class="p">,</span> <span class="s2">"&lt;frozen importlib._bootstrap&gt;"</span><span class="p">),</span>
<span class="n">tracemalloc</span><span class="o">.</span><span class="n">Filter</span><span class="p">(</span><span class="kc">False</span><span class="p">,</span> <span class="s2">"&lt;unknown&gt;"</span><span class="p">),</span>
<span class="p">))</span>
<span class="n">top_stats</span> <span class="o">=</span> <span class="n">snapshot</span><span class="o">.</span><span class="n">statistics</span><span class="p">(</span><span class="n">group_by</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Top </span><span class="si">%s</span><span class="s2"> lines"</span> <span class="o">%</span> <span class="n">limit</span><span class="p">)</span>
<span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">stat</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">top_stats</span><span class="p">[:</span><span class="n">limit</span><span class="p">],</span> <span class="mi">1</span><span class="p">):</span>
<span class="n">frame</span> <span class="o">=</span> <span class="n">stat</span><span class="o">.</span><span class="n">traceback</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># replace "/path/to/module/file.py" with "module/file.py"</span>
<span class="n">filename</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">sep</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">frame</span><span class="o">.</span><span class="n">filename</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">sep</span><span class="p">)[</span><span class="o">-</span><span class="mi">2</span><span class="p">:])</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"#</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">: </span><span class="si">%.1f</span><span class="s2"> KiB"</span>
<span class="o">%</span> <span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">frame</span><span class="o">.</span><span class="n">lineno</span><span class="p">,</span> <span class="n">stat</span><span class="o">.</span><span class="n">size</span> <span class="o">/</span> <span class="mi">1024</span><span class="p">))</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">linecache</span><span class="o">.</span><span class="n">getline</span><span class="p">(</span><span class="n">frame</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="n">frame</span><span class="o">.</span><span class="n">lineno</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">if</span> <span class="n">line</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">' </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">line</span><span class="p">)</span>
<span class="n">other</span> <span class="o">=</span> <span class="n">top_stats</span><span class="p">[</span><span class="n">limit</span><span class="p">:]</span>
<span class="k">if</span> <span class="n">other</span><span class="p">:</span>
<span class="n">size</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">stat</span><span class="o">.</span><span class="n">size</span> <span class="k">for</span> <span class="n">stat</span> <span class="ow">in</span> <span class="n">other</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2"> other: </span><span class="si">%.1f</span><span class="s2"> KiB"</span> <span class="o">%</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">other</span><span class="p">),</span> <span class="n">size</span> <span class="o">/</span> <span class="mi">1024</span><span class="p">))</span>
<span class="n">total</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">stat</span><span class="o">.</span><span class="n">size</span> <span class="k">for</span> <span class="n">stat</span> <span class="ow">in</span> <span class="n">top_stats</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Total allocated size: </span><span class="si">%.1f</span><span class="s2"> KiB"</span> <span class="o">%</span> <span class="p">(</span><span class="n">total</span> <span class="o">/</span> <span class="mi">1024</span><span class="p">))</span>
<span class="n">tracemalloc</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="c1"># ... run your application ...</span>
<span class="n">snapshot</span> <span class="o">=</span> <span class="n">tracemalloc</span><span class="o">.</span><span class="n">take_snapshot</span><span class="p">()</span>
<span class="n">display_top</span><span class="p">(</span><span class="n">snapshot</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-48">Python测试套件的输出示例</span></p><pre><code class="language-python"><span></span><span class="n">Top</span> <span class="mi">10</span> <span class="n">lines</span>
<span class="c1">#1: Lib/base64.py:414: 419.8 KiB</span>
<span class="n">_b85chars2</span> <span class="o">=</span> <span class="p">[(</span><span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">)</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">_b85chars</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">_b85chars</span><span class="p">]</span>
<span class="c1">#2: Lib/base64.py:306: 419.8 KiB</span>
<span class="n">_a85chars2</span> <span class="o">=</span> <span class="p">[(</span><span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">)</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">_a85chars</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">_a85chars</span><span class="p">]</span>
<span class="c1">#3: collections/__init__.py:368: 293.6 KiB</span>
<span class="n">exec</span><span class="p">(</span><span class="n">class_definition</span><span class="p">,</span> <span class="n">namespace</span><span class="p">)</span>
<span class="c1">#4: Lib/abc.py:133: 115.2 KiB</span>
<span class="n">cls</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">__new__</span><span class="p">(</span><span class="n">mcls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">namespace</span><span class="p">)</span>
<span class="c1">#5: unittest/case.py:574: 103.1 KiB</span>
<span class="n">testMethod</span><span class="p">()</span>
<span class="c1">#6: Lib/linecache.py:127: 95.4 KiB</span>
<span class="n">lines</span> <span class="o">=</span> <span class="n">fp</span><span class="o">.</span><span class="n">readlines</span><span class="p">()</span>
<span class="c1">#7: urllib/parse.py:476: 71.8 KiB</span>
<span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">_hexdig</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">_hexdig</span><span class="p">}</span>
<span class="c1">#8: &lt;string&gt;:5: 62.0 KiB</span>
<span class="c1">#9: Lib/_weakrefset.py:37: 60.0 KiB</span>
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="c1">#10: Lib/base64.py:142: 59.8 KiB</span>
<span class="n">_b32tab2</span> <span class="o">=</span> <span class="p">[</span><span class="n">a</span> <span class="o">+</span> <span class="n">b</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">_b32tab</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">_b32tab</span><span class="p">]</span>
<span class="mi">6220</span> <span class="n">other</span><span class="p">:</span> <span class="mf">3602.8</span> <span class="n">KiB</span>
<span class="n">Total</span> <span class="n">allocated</span> <span class="n">size</span><span class="p">:</span> <span class="mf">5303.1</span> <span class="n">KiB</span>
</code></pre><p><span class="yiyi-st" id="yiyi-49">有关更多选项,请参见<a class="reference internal" href="#tracemalloc.Snapshot.statistics" title="tracemalloc.Snapshot.statistics"><code class="xref py py-meth docutils literal"><span class="pre">Snapshot.statistics()</span></code></a></span></p></div></div><div class="section" id="api"><h2><span class="yiyi-st" id="yiyi-50">27.7.2. </span><span class="yiyi-st" id="yiyi-51">API</span></h2><div class="section" id="functions"><h3><span class="yiyi-st" id="yiyi-52">27.7.2.1. </span><span class="yiyi-st" id="yiyi-53">Functions</span></h3><dl class="function"><dt id="tracemalloc.clear_traces"><span class="yiyi-st" id="yiyi-54"> <code class="descclassname">tracemalloc.</code><code class="descname">clear_traces</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-55">清除Python分配的内存块的痕迹。</span></p><p><span class="yiyi-st" id="yiyi-56">另请参见<a class="reference internal" href="#tracemalloc.stop" title="tracemalloc.stop"><code class="xref py py-func docutils literal"><span class="pre">stop()</span></code></a></span></p></dd></dl><dl class="function"><dt id="tracemalloc.get_object_traceback"><span class="yiyi-st" id="yiyi-57"> <code class="descclassname">tracemalloc.</code><code class="descname">get_object_traceback</code><span class="sig-paren">(</span><em>obj</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-58">获取分配了Python对象<em>obj</em>的traceback。</span><span class="yiyi-st" id="yiyi-59">如果<a class="reference internal" href="#module-tracemalloc" title="tracemalloc: Trace memory allocations."><code class="xref py py-mod docutils literal"><span class="pre">tracemalloc</span></code></a>模块未跟踪内存分配或未跟踪对象的分配,则返回<a class="reference internal" href="#tracemalloc.Traceback" title="tracemalloc.Traceback"><code class="xref py py-class docutils literal"><span class="pre">Traceback</span></code></a>实例或<code class="docutils literal"><span class="pre">None</span></code></span></p><p><span class="yiyi-st" id="yiyi-60">另请参见<a class="reference internal" href="gc.html#gc.get_referrers" title="gc.get_referrers"><code class="xref py py-func docutils literal"><span class="pre">gc.get_referrers()</span></code></a><a class="reference internal" href="sys.html#sys.getsizeof" title="sys.getsizeof"><code class="xref py py-func docutils literal"><span class="pre">sys.getsizeof()</span></code></a>函数。</span></p></dd></dl><dl class="function"><dt id="tracemalloc.get_traceback_limit"><span class="yiyi-st" id="yiyi-61"> <code class="descclassname">tracemalloc.</code><code class="descname">get_traceback_limit</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-62">获取跟踪的回溯中存储的最大帧数。</span></p><p><span class="yiyi-st" id="yiyi-63"><a class="reference internal" href="#module-tracemalloc" title="tracemalloc: Trace memory allocations."><code class="xref py py-mod docutils literal"><span class="pre">tracemalloc</span></code></a>模块必须跟踪内存分配才能获得限制,否则会引发异常。</span></p><p><span class="yiyi-st" id="yiyi-64">该限制由<a class="reference internal" href="#tracemalloc.start" title="tracemalloc.start"><code class="xref py py-func docutils literal"><span class="pre">start()</span></code></a>函数设置。</span></p></dd></dl><dl class="function"><dt id="tracemalloc.get_traced_memory"><span class="yiyi-st" id="yiyi-65"> <code class="descclassname">tracemalloc.</code><code class="descname">get_traced_memory</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-66"><a class="reference internal" href="#module-tracemalloc" title="tracemalloc: Trace memory allocations."><code class="xref py py-mod docutils literal"><span class="pre">tracemalloc</span></code></a>模块作为元组获取由其跟踪的内存块的当前大小和峰值大小:<code class="docutils literal"><span class="pre">current</span> <span class="pre">int</span> <span class="pre"> peak</span> <span class="pre">int</span></code></span></p></dd></dl><dl class="function"><dt id="tracemalloc.get_tracemalloc_memory"><span class="yiyi-st" id="yiyi-67"> <code class="descclassname">tracemalloc.</code><code class="descname">get_tracemalloc_memory</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-68">获取用于存储内存块的跟踪的<a class="reference internal" href="#module-tracemalloc" title="tracemalloc: Trace memory allocations."><code class="xref py py-mod docutils literal"><span class="pre">tracemalloc</span></code></a>模块的内存使用情况(以字节为单位)。</span><span class="yiyi-st" id="yiyi-69">返回<a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal"><span class="pre">int</span></code></a></span></p></dd></dl><dl class="function"><dt id="tracemalloc.is_tracing"><span class="yiyi-st" id="yiyi-70"> <code class="descclassname">tracemalloc.</code><code class="descname">is_tracing</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-71"><code class="docutils literal"><span class="pre">True</span></code>如果<a class="reference internal" href="#module-tracemalloc" title="tracemalloc: Trace memory allocations."><code class="xref py py-mod docutils literal"><span class="pre">tracemalloc</span></code></a>模块正在跟踪Python内存分配<code class="docutils literal"><span class="pre">False</span></code></span></p><p><span class="yiyi-st" id="yiyi-72">另请参见<a class="reference internal" href="#tracemalloc.start" title="tracemalloc.start"><code class="xref py py-func docutils literal"><span class="pre">start()</span></code></a><a class="reference internal" href="#tracemalloc.stop" title="tracemalloc.stop"><code class="xref py py-func docutils literal"><span class="pre">stop()</span></code></a>函数。</span></p></dd></dl><dl class="function"><dt id="tracemalloc.start"><span class="yiyi-st" id="yiyi-73"> <code class="descclassname">tracemalloc.</code><code class="descname">start</code><span class="sig-paren">(</span><em>nframe: int=1</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-74">开始跟踪Python内存分配在Python内存分配器上安装钩子。</span><span class="yiyi-st" id="yiyi-75">收集的跟踪回溯将限制为<em>nframe</em>帧。</span><span class="yiyi-st" id="yiyi-76">默认情况下,内存块的跟踪仅存储最近的帧:限制为<code class="docutils literal"><span class="pre">1</span></code><em>nframe</em>必须大于或等于<code class="docutils literal"><span class="pre">1</span></code></span></p><p><span class="yiyi-st" id="yiyi-77">Storing more than <code class="docutils literal"><span class="pre">1</span></code> frame is only useful to compute statistics grouped by <code class="docutils literal"><span class="pre">'traceback'</span></code> or to compute cumulative statistics: see the <a class="reference internal" href="#tracemalloc.Snapshot.compare_to" title="tracemalloc.Snapshot.compare_to"><code class="xref py py-meth docutils literal"><span class="pre">Snapshot.compare_to()</span></code></a> and <a class="reference internal" href="#tracemalloc.Snapshot.statistics" title="tracemalloc.Snapshot.statistics"><code class="xref py py-meth docutils literal"><span class="pre">Snapshot.statistics()</span></code></a> methods.</span></p><p><span class="yiyi-st" id="yiyi-78">存储更多帧会增加<a class="reference internal" href="#module-tracemalloc" title="tracemalloc: Trace memory allocations."><code class="xref py py-mod docutils literal"><span class="pre">tracemalloc</span></code></a>模块的内存和CPU开销。</span><span class="yiyi-st" id="yiyi-79">使用<a class="reference internal" href="#tracemalloc.get_tracemalloc_memory" title="tracemalloc.get_tracemalloc_memory"><code class="xref py py-func docutils literal"><span class="pre">get_tracemalloc_memory()</span></code></a>函数来测量<a class="reference internal" href="#module-tracemalloc" title="tracemalloc: Trace memory allocations."><code class="xref py py-mod docutils literal"><span class="pre">tracemalloc</span></code></a>模块使用的内存量。</span></p><p><span class="yiyi-st" id="yiyi-80">The <span class="target" id="index-2"></span><a class="reference internal" href="../using/cmdline.html#envvar-PYTHONTRACEMALLOC"><code class="xref std std-envvar docutils literal"><span class="pre">PYTHONTRACEMALLOC</span></code></a> environment variable (<code class="docutils literal"><span class="pre">PYTHONTRACEMALLOC=NFRAME</span></code>) and the <a class="reference internal" href="../using/cmdline.html#cmdoption-X"><code class="xref std std-option docutils literal"><span class="pre">-X</span></code></a> <code class="docutils literal"><span class="pre">tracemalloc=NFRAME</span></code> command line option can be used to start tracing at startup.</span></p><p><span class="yiyi-st" id="yiyi-81">另请参见<a class="reference internal" href="#tracemalloc.stop" title="tracemalloc.stop"><code class="xref py py-func docutils literal"><span class="pre">stop()</span></code></a><a class="reference internal" href="#tracemalloc.is_tracing" title="tracemalloc.is_tracing"><code class="xref py py-func docutils literal"><span class="pre">is_tracing()</span></code></a><a class="reference internal" href="#tracemalloc.get_traceback_limit" title="tracemalloc.get_traceback_limit"><code class="xref py py-func docutils literal"><span class="pre">get_traceback_limit()</span></code></a>函数。</span></p></dd></dl><dl class="function"><dt id="tracemalloc.stop"><span class="yiyi-st" id="yiyi-82"> <code class="descclassname">tracemalloc.</code><code class="descname">stop</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-83">停止跟踪Python内存分配卸载Python内存分配器上的钩子。</span><span class="yiyi-st" id="yiyi-84">还清除所有以前收集的由Python分配的内存块的跟踪。</span></p><p><span class="yiyi-st" id="yiyi-85">调用<a class="reference internal" href="#tracemalloc.take_snapshot" title="tracemalloc.take_snapshot"><code class="xref py py-func docutils literal"><span class="pre">take_snapshot()</span></code></a>函数在清除之前对轨迹进行快照。</span></p><p><span class="yiyi-st" id="yiyi-86">另请参见<a class="reference internal" href="#tracemalloc.start" title="tracemalloc.start"><code class="xref py py-func docutils literal"><span class="pre">start()</span></code></a><a class="reference internal" href="#tracemalloc.is_tracing" title="tracemalloc.is_tracing"><code class="xref py py-func docutils literal"><span class="pre">is_tracing()</span></code></a><a class="reference internal" href="#tracemalloc.clear_traces" title="tracemalloc.clear_traces"><code class="xref py py-func docutils literal"><span class="pre">clear_traces()</span></code></a>函数。</span></p></dd></dl><dl class="function"><dt id="tracemalloc.take_snapshot"><span class="yiyi-st" id="yiyi-87"> <code class="descclassname">tracemalloc.</code><code class="descname">take_snapshot</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-88">对由Python分配的内存块的痕迹进行快照。</span><span class="yiyi-st" id="yiyi-89">返回新的<a class="reference internal" href="#tracemalloc.Snapshot" title="tracemalloc.Snapshot"><code class="xref py py-class docutils literal"><span class="pre">Snapshot</span></code></a>实例。</span></p><p><span class="yiyi-st" id="yiyi-90">快照不包括在<a class="reference internal" href="#module-tracemalloc" title="tracemalloc: Trace memory allocations."><code class="xref py py-mod docutils literal"><span class="pre">tracemalloc</span></code></a>模块开始跟踪内存分配之前分配的内存块。</span></p><p><span class="yiyi-st" id="yiyi-91">跟踪的回溯限制为<a class="reference internal" href="#tracemalloc.get_traceback_limit" title="tracemalloc.get_traceback_limit"><code class="xref py py-func docutils literal"><span class="pre">get_traceback_limit()</span></code></a>帧。</span><span class="yiyi-st" id="yiyi-92">使用<a class="reference internal" href="#tracemalloc.start" title="tracemalloc.start"><code class="xref py py-func docutils literal"><span class="pre">start()</span></code></a>函数的<em>nframe</em>参数存储更多帧。</span></p><p><span class="yiyi-st" id="yiyi-93"><a class="reference internal" href="#module-tracemalloc" title="tracemalloc: Trace memory allocations."><code class="xref py py-mod docutils literal"><span class="pre">tracemalloc</span></code></a>模块必须跟踪内存分配以拍摄快照,请参阅<a class="reference internal" href="#tracemalloc.start" title="tracemalloc.start"><code class="xref py py-func docutils literal"><span class="pre">start()</span></code></a>函数。</span></p><p><span class="yiyi-st" id="yiyi-94">另请参见<a class="reference internal" href="#tracemalloc.get_object_traceback" title="tracemalloc.get_object_traceback"><code class="xref py py-func docutils literal"><span class="pre">get_object_traceback()</span></code></a>函数。</span></p></dd></dl></div><div class="section" id="filter"><h3><span class="yiyi-st" id="yiyi-95">27.7.2.2. </span><span class="yiyi-st" id="yiyi-96">Filter</span></h3><dl class="class"><dt id="tracemalloc.Filter"><span class="yiyi-st" id="yiyi-97"> <em class="property">class </em><code class="descclassname">tracemalloc.</code><code class="descname">Filter</code><span class="sig-paren">(</span><em>inclusive: bool</em>, <em>filename_pattern: str</em>, <em>lineno: int=None</em>, <em>all_frames: bool=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-98">在内存块的跟踪上进行过滤。</span></p><p><span class="yiyi-st" id="yiyi-99">有关<em>filename_pattern</em>的语法,请参见<a class="reference internal" href="fnmatch.html#fnmatch.fnmatch" title="fnmatch.fnmatch"><code class="xref py py-func docutils literal"><span class="pre">fnmatch.fnmatch()</span></code></a>函数。</span><span class="yiyi-st" id="yiyi-100"><code class="docutils literal"><span class="pre">'.pyc'</span></code>文件扩展名替换为<code class="docutils literal"><span class="pre">'.py'</span></code></span></p><p><span class="yiyi-st" id="yiyi-101">例子:</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-102"><code class="docutils literal"><span class="pre">过滤器True</span> <span class="pre">子过程.__文件__</span></code>仅包含<a class="reference internal" href="subprocess.html#module-subprocess" title="subprocess: Subprocess management."><code class="xref py py-mod docutils literal"><span class="pre">subprocess</span></code></a></span></li><li><span class="yiyi-st" id="yiyi-103"><code class="docutils literal"><span class="pre">筛选False</span> <span class="pre">tracemalloc .__ file __</span></code>排除<a class="reference internal" href="#module-tracemalloc" title="tracemalloc: Trace memory allocations."><code class="xref py py-mod docutils literal"><span class="pre">tracemalloc</span></code></a></span></li><li><span class="yiyi-st" id="yiyi-104"><code class="docutils literal"><span class="pre">过滤False</span> <span class="pre">lt未知gt</span></code></span></li></ul><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-105"><span class="versionmodified">在3.5版本中更改:</span> <code class="docutils literal"><span class="pre">'.pyo'</span></code>文件扩展名不再替换为<code class="docutils literal"><span class="pre">'.py'</span></code></span></p></div><dl class="attribute"><dt id="tracemalloc.Filter.inclusive"><span class="yiyi-st" id="yiyi-106"> <code class="descname">inclusive</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-107">If <em>inclusive</em> is <code class="docutils literal"><span class="pre">True</span></code> (include), only trace memory blocks allocated in a file with a name matching <a class="reference internal" href="#tracemalloc.Filter.filename_pattern" title="tracemalloc.Filter.filename_pattern"><code class="xref py py-attr docutils literal"><span class="pre">filename_pattern</span></code></a> at line number <a class="reference internal" href="#tracemalloc.Filter.lineno" title="tracemalloc.Filter.lineno"><code class="xref py py-attr docutils literal"><span class="pre">lineno</span></code></a>.</span></p><p><span class="yiyi-st" id="yiyi-108">If <em>inclusive</em> is <code class="docutils literal"><span class="pre">False</span></code> (exclude), ignore memory blocks allocated in a file with a name matching <a class="reference internal" href="#tracemalloc.Filter.filename_pattern" title="tracemalloc.Filter.filename_pattern"><code class="xref py py-attr docutils literal"><span class="pre">filename_pattern</span></code></a> at line number <a class="reference internal" href="#tracemalloc.Filter.lineno" title="tracemalloc.Filter.lineno"><code class="xref py py-attr docutils literal"><span class="pre">lineno</span></code></a>.</span></p></dd></dl><dl class="attribute"><dt id="tracemalloc.Filter.lineno"><span class="yiyi-st" id="yiyi-109"> <code class="descname">lineno</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-110">过滤器的行号(<code class="docutils literal"><span class="pre">int</span></code>)。</span><span class="yiyi-st" id="yiyi-111">如果<em>lineno</em><code class="docutils literal"><span class="pre">None</span></code>,则过滤器将匹配任何行号。</span></p></dd></dl><dl class="attribute"><dt id="tracemalloc.Filter.filename_pattern"><span class="yiyi-st" id="yiyi-112"> <code class="descname">filename_pattern</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-113">过滤器的文件名模式(<code class="docutils literal"><span class="pre">str</span></code>)。</span></p></dd></dl><dl class="attribute"><dt id="tracemalloc.Filter.all_frames"><span class="yiyi-st" id="yiyi-114"> <code class="descname">all_frames</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-115">如果<em>all_frames</em><code class="docutils literal"><span class="pre">True</span></code>,则检查回溯的所有帧。</span><span class="yiyi-st" id="yiyi-116">如果<em>all_frames</em><code class="docutils literal"><span class="pre">False</span></code>,则只检查最近的帧。</span></p><p><span class="yiyi-st" id="yiyi-117">如果回溯限制为<code class="docutils literal"><span class="pre">1</span></code>,则此属性不起作用。</span><span class="yiyi-st" id="yiyi-118">请参阅<a class="reference internal" href="#tracemalloc.get_traceback_limit" title="tracemalloc.get_traceback_limit"><code class="xref py py-func docutils literal"><span class="pre">get_traceback_limit()</span></code></a>函数和<a class="reference internal" href="#tracemalloc.Snapshot.traceback_limit" title="tracemalloc.Snapshot.traceback_limit"><code class="xref py py-attr docutils literal"><span class="pre">Snapshot.traceback_limit</span></code></a>属性。</span></p></dd></dl></dd></dl></div><div class="section" id="frame"><h3><span class="yiyi-st" id="yiyi-119">27.7.2.3. </span><span class="yiyi-st" id="yiyi-120">Frame</span></h3><dl class="class"><dt id="tracemalloc.Frame"><span class="yiyi-st" id="yiyi-121"> <em class="property">class </em><code class="descclassname">tracemalloc.</code><code class="descname">Frame</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-122">回溯的帧。</span></p><p><span class="yiyi-st" id="yiyi-123"><a class="reference internal" href="#tracemalloc.Traceback" title="tracemalloc.Traceback"><code class="xref py py-class docutils literal"><span class="pre">Traceback</span></code></a>类是<a class="reference internal" href="#tracemalloc.Frame" title="tracemalloc.Frame"><code class="xref py py-class docutils literal"><span class="pre">Frame</span></code></a>实例的序列。</span></p><dl class="attribute"><dt id="tracemalloc.Frame.filename"><span class="yiyi-st" id="yiyi-124"> <code class="descname">filename</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-125">文件名(<code class="docutils literal"><span class="pre">str</span></code>)。</span></p></dd></dl><dl class="attribute"><dt id="tracemalloc.Frame.lineno"><span class="yiyi-st" id="yiyi-126"> <code class="descname">lineno</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-127">行号(<code class="docutils literal"><span class="pre">int</span></code>)。</span></p></dd></dl></dd></dl></div><div class="section" id="snapshot"><h3><span class="yiyi-st" id="yiyi-128">27.7.2.4. </span><span class="yiyi-st" id="yiyi-129">Snapshot</span></h3><dl class="class"><dt id="tracemalloc.Snapshot"><span class="yiyi-st" id="yiyi-130"> <em class="property">class </em><code class="descclassname">tracemalloc.</code><code class="descname">Snapshot</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-131">由Python分配的内存块的跟踪的快照。</span></p><p><span class="yiyi-st" id="yiyi-132"><a class="reference internal" href="#tracemalloc.take_snapshot" title="tracemalloc.take_snapshot"><code class="xref py py-func docutils literal"><span class="pre">take_snapshot()</span></code></a>函数创建快照实例。</span></p><dl class="method"><dt id="tracemalloc.Snapshot.compare_to"><span class="yiyi-st" id="yiyi-133"> <code class="descname">compare_to</code><span class="sig-paren">(</span><em>old_snapshot: Snapshot</em>, <em>group_by: str</em>, <em>cumulative: bool=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-134">计算与旧快照的差异。</span><span class="yiyi-st" id="yiyi-135">将统计信息作为按<em>group_by</em>分组的<a class="reference internal" href="#tracemalloc.StatisticDiff" title="tracemalloc.StatisticDiff"><code class="xref py py-class docutils literal"><span class="pre">StatisticDiff</span></code></a>实例的排序列表。</span></p><p><span class="yiyi-st" id="yiyi-136">请参阅<em>group_by</em><em>累积</em>参数的<a class="reference internal" href="#tracemalloc.Snapshot.statistics" title="tracemalloc.Snapshot.statistics"><code class="xref py py-meth docutils literal"><span class="pre">Snapshot.statistics()</span></code></a>方法。</span></p><p><span class="yiyi-st" id="yiyi-137">结果通过以下方法从最大到最小排序:<a class="reference internal" href="#tracemalloc.StatisticDiff.size_diff" title="tracemalloc.StatisticDiff.size_diff"><code class="xref py py-attr docutils literal"><span class="pre">StatisticDiff.size_diff</span></code></a><a class="reference internal" href="#tracemalloc.StatisticDiff.size" title="tracemalloc.StatisticDiff.size"><code class="xref py py-attr docutils literal"><span class="pre">StatisticDiff.size</span></code></a>的绝对值,<a class="reference internal" href="#tracemalloc.StatisticDiff.count_diff" title="tracemalloc.StatisticDiff.count_diff"><code class="xref py py-attr docutils literal"><span class="pre">StatisticDiff.count_diff</span></code></a> <a class="reference internal" href="#tracemalloc.Statistic.count" title="tracemalloc.Statistic.count"><code class="xref py py-attr docutils literal"><span class="pre">Statistic.count</span></code></a>,然后按<a class="reference internal" href="#tracemalloc.StatisticDiff.traceback" title="tracemalloc.StatisticDiff.traceback"><code class="xref py py-attr docutils literal"><span class="pre">StatisticDiff.traceback</span></code></a></span></p></dd></dl><dl class="method"><dt id="tracemalloc.Snapshot.dump"><span class="yiyi-st" id="yiyi-138"> <code class="descname">dump</code><span class="sig-paren">(</span><em>filename</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-139">将快照写入文件。</span></p><p><span class="yiyi-st" id="yiyi-140">使用<a class="reference internal" href="#tracemalloc.Snapshot.load" title="tracemalloc.Snapshot.load"><code class="xref py py-meth docutils literal"><span class="pre">load()</span></code></a>重新加载快照。</span></p></dd></dl><dl class="method"><dt id="tracemalloc.Snapshot.filter_traces"><span class="yiyi-st" id="yiyi-141"> <code class="descname">filter_traces</code><span class="sig-paren">(</span><em>filters</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-142">使用过滤的<a class="reference internal" href="#tracemalloc.Snapshot.traces" title="tracemalloc.Snapshot.traces"><code class="xref py py-attr docutils literal"><span class="pre">traces</span></code></a>序列创建新的<a class="reference internal" href="#tracemalloc.Snapshot" title="tracemalloc.Snapshot"><code class="xref py py-class docutils literal"><span class="pre">Snapshot</span></code></a>实例,<em>过滤器</em><a class="reference internal" href="#tracemalloc.Filter" title="tracemalloc.Filter"><code class="xref py py-class docutils literal"><span class="pre">Filter</span></code></a>实例的列表。</span><span class="yiyi-st" id="yiyi-143">如果<em>过滤器</em>是空列表,则返回一个带有跟踪副本的新的<a class="reference internal" href="#tracemalloc.Snapshot" title="tracemalloc.Snapshot"><code class="xref py py-class docutils literal"><span class="pre">Snapshot</span></code></a>实例。</span></p><p><span class="yiyi-st" id="yiyi-144">同时应用所有包含的过滤器,如果没有包含的过滤器匹配,则忽略跟踪。</span><span class="yiyi-st" id="yiyi-145">如果至少有一个排他过滤器匹配,则会忽略跟踪。</span></p></dd></dl><dl class="classmethod"><dt id="tracemalloc.Snapshot.load"><span class="yiyi-st" id="yiyi-146"> <em class="property">classmethod </em><code class="descname">load</code><span class="sig-paren">(</span><em>filename</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-147">从文件加载快照。</span></p><p><span class="yiyi-st" id="yiyi-148">另请参见<a class="reference internal" href="#tracemalloc.Snapshot.dump" title="tracemalloc.Snapshot.dump"><code class="xref py py-meth docutils literal"><span class="pre">dump()</span></code></a></span></p></dd></dl><dl class="method"><dt id="tracemalloc.Snapshot.statistics"><span class="yiyi-st" id="yiyi-149"> <code class="descname">statistics</code><span class="sig-paren">(</span><em>group_by: str</em>, <em>cumulative: bool=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-150">将统计信息作为按<em>group_by</em>分组的<a class="reference internal" href="#tracemalloc.Statistic" title="tracemalloc.Statistic"><code class="xref py py-class docutils literal"><span class="pre">Statistic</span></code></a>实例的排序列表:</span></p><table border="1" class="docutils"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-151">通过...分组</span></th><th class="head"><span class="yiyi-st" id="yiyi-152">描述</span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-153"><code class="docutils literal"><span class="pre">'filename'</span></code></span></td><td><span class="yiyi-st" id="yiyi-154">文件名</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-155"><code class="docutils literal"><span class="pre">'lineno'</span></code></span></td><td><span class="yiyi-st" id="yiyi-156">文件名和行号</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-157"><code class="docutils literal"><span class="pre">'traceback'</span></code></span></td><td><span class="yiyi-st" id="yiyi-158">追溯</span></td></tr></tbody></table><p><span class="yiyi-st" id="yiyi-159">如果<em>cumulative</em><code class="docutils literal"><span class="pre">True</span></code>,则累加跟踪的回溯的所有帧的内存块的大小和计数,而不仅是最近的帧。</span><span class="yiyi-st" id="yiyi-160">累积模式只能与<em>group_by</em>等于<code class="docutils literal"><span class="pre">'filename'</span></code><code class="docutils literal"><span class="pre">'lineno'</span></code>一起使用。</span></p><p><span class="yiyi-st" id="yiyi-161">结果通过以下方式从最大到最小排序:<a class="reference internal" href="#tracemalloc.Statistic.size" title="tracemalloc.Statistic.size"><code class="xref py py-attr docutils literal"><span class="pre">Statistic.size</span></code></a><a class="reference internal" href="#tracemalloc.Statistic.count" title="tracemalloc.Statistic.count"><code class="xref py py-attr docutils literal"><span class="pre">Statistic.count</span></code></a>,然后按<a class="reference internal" href="#tracemalloc.Statistic.traceback" title="tracemalloc.Statistic.traceback"><code class="xref py py-attr docutils literal"><span class="pre">Statistic.traceback</span></code></a></span></p></dd></dl><dl class="attribute"><dt id="tracemalloc.Snapshot.traceback_limit"><span class="yiyi-st" id="yiyi-162"> <code class="descname">traceback_limit</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-163">存储在<a class="reference internal" href="#tracemalloc.Snapshot.traces" title="tracemalloc.Snapshot.traces"><code class="xref py py-attr docutils literal"><span class="pre">traces</span></code></a>:拍摄快照时<a class="reference internal" href="#tracemalloc.get_traceback_limit" title="tracemalloc.get_traceback_limit"><code class="xref py py-func docutils literal"><span class="pre">get_traceback_limit()</span></code></a>的结果。</span></p></dd></dl><dl class="attribute"><dt id="tracemalloc.Snapshot.traces"><span class="yiyi-st" id="yiyi-164"> <code class="descname">traces</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-165">Python分配的所有内存块的跟踪<a class="reference internal" href="#tracemalloc.Trace" title="tracemalloc.Trace"><code class="xref py py-class docutils literal"><span class="pre">Trace</span></code></a>实例的序列。</span></p><p><span class="yiyi-st" id="yiyi-166">序列具有未定义的顺序。</span><span class="yiyi-st" id="yiyi-167">使用<a class="reference internal" href="#tracemalloc.Snapshot.statistics" title="tracemalloc.Snapshot.statistics"><code class="xref py py-meth docutils literal"><span class="pre">Snapshot.statistics()</span></code></a>方法获取统计信息的排序列表。</span></p></dd></dl></dd></dl></div><div class="section" id="statistic"><h3><span class="yiyi-st" id="yiyi-168">27.7.2.5. </span><span class="yiyi-st" id="yiyi-169">Statistic</span></h3><dl class="class"><dt id="tracemalloc.Statistic"><span class="yiyi-st" id="yiyi-170"> <em class="property">class </em><code class="descclassname">tracemalloc.</code><code class="descname">Statistic</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-171">内存分配统计。</span></p><p><span class="yiyi-st" id="yiyi-172"><a class="reference internal" href="#tracemalloc.Snapshot.statistics" title="tracemalloc.Snapshot.statistics"><code class="xref py py-func docutils literal"><span class="pre">Snapshot.statistics()</span></code></a>返回<a class="reference internal" href="#tracemalloc.Statistic" title="tracemalloc.Statistic"><code class="xref py py-class docutils literal"><span class="pre">Statistic</span></code></a>实例的列表。</span></p><p><span class="yiyi-st" id="yiyi-173">另请参见<a class="reference internal" href="#tracemalloc.StatisticDiff" title="tracemalloc.StatisticDiff"><code class="xref py py-class docutils literal"><span class="pre">StatisticDiff</span></code></a>类。</span></p><dl class="attribute"><dt id="tracemalloc.Statistic.count"><span class="yiyi-st" id="yiyi-174"> <code class="descname">count</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-175">内存块数​​(<code class="docutils literal"><span class="pre">int</span></code>)。</span></p></dd></dl><dl class="attribute"><dt id="tracemalloc.Statistic.size"><span class="yiyi-st" id="yiyi-176"> <code class="descname">size</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-177">内存块的总大小(以字节为单位)(<code class="docutils literal"><span class="pre">int</span></code>)。</span></p></dd></dl><dl class="attribute"><dt id="tracemalloc.Statistic.traceback"><span class="yiyi-st" id="yiyi-178"> <code class="descname">traceback</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-179">分配内存块的回溯,<a class="reference internal" href="#tracemalloc.Traceback" title="tracemalloc.Traceback"><code class="xref py py-class docutils literal"><span class="pre">Traceback</span></code></a>实例。</span></p></dd></dl></dd></dl></div><div class="section" id="statisticdiff"><h3><span class="yiyi-st" id="yiyi-180">27.7.2.6. </span><span class="yiyi-st" id="yiyi-181">StatisticDiff</span></h3><dl class="class"><dt id="tracemalloc.StatisticDiff"><span class="yiyi-st" id="yiyi-182"> <em class="property">class </em><code class="descclassname">tracemalloc.</code><code class="descname">StatisticDiff</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-183">旧的和新的<a class="reference internal" href="#tracemalloc.Snapshot" title="tracemalloc.Snapshot"><code class="xref py py-class docutils literal"><span class="pre">Snapshot</span></code></a>实例之间的内存分配上的统计差异。</span></p><p><span class="yiyi-st" id="yiyi-184"><a class="reference internal" href="#tracemalloc.Snapshot.compare_to" title="tracemalloc.Snapshot.compare_to"><code class="xref py py-func docutils literal"><span class="pre">Snapshot.compare_to()</span></code></a>返回<a class="reference internal" href="#tracemalloc.StatisticDiff" title="tracemalloc.StatisticDiff"><code class="xref py py-class docutils literal"><span class="pre">StatisticDiff</span></code></a>实例的列表。</span><span class="yiyi-st" id="yiyi-185">另请参见<a class="reference internal" href="#tracemalloc.Statistic" title="tracemalloc.Statistic"><code class="xref py py-class docutils literal"><span class="pre">Statistic</span></code></a>类。</span></p><dl class="attribute"><dt id="tracemalloc.StatisticDiff.count"><span class="yiyi-st" id="yiyi-186"> <code class="descname">count</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-187">新快照中的内存块数(<code class="docutils literal"><span class="pre">int</span></code><code class="docutils literal"><span class="pre">0</span></code>如果内存块已在新快照中释放。</span></p></dd></dl><dl class="attribute"><dt id="tracemalloc.StatisticDiff.count_diff"><span class="yiyi-st" id="yiyi-188"> <code class="descname">count_diff</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-189">如果在新快照中分配了内存块,则旧快照和新快照(<code class="docutils literal"><span class="pre">int</span></code>)之间的内存块数的差异:<code class="docutils literal"><span class="pre">0</span></code></span></p></dd></dl><dl class="attribute"><dt id="tracemalloc.StatisticDiff.size"><span class="yiyi-st" id="yiyi-190"> <code class="descname">size</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-191">如果内存块已在新快照中释放,则新快照(<code class="docutils literal"><span class="pre">int</span></code>)中内存块的总大小(以字节为单位):<code class="docutils literal"><span class="pre">0</span></code></span></p></dd></dl><dl class="attribute"><dt id="tracemalloc.StatisticDiff.size_diff"><span class="yiyi-st" id="yiyi-192"> <code class="descname">size_diff</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-193">如果内存块已在新快照中分配,则旧快照和新快照(<code class="docutils literal"><span class="pre">int</span></code>)之间的内存块总大小(以字节为单位)的差异:<code class="docutils literal"><span class="pre">0</span></code></span></p></dd></dl><dl class="attribute"><dt id="tracemalloc.StatisticDiff.traceback"><span class="yiyi-st" id="yiyi-194"> <code class="descname">traceback</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-195">分配内存块的回溯,<a class="reference internal" href="#tracemalloc.Traceback" title="tracemalloc.Traceback"><code class="xref py py-class docutils literal"><span class="pre">Traceback</span></code></a>实例。</span></p></dd></dl></dd></dl></div><div class="section" id="trace"><h3><span class="yiyi-st" id="yiyi-196">27.7.2.7. </span><span class="yiyi-st" id="yiyi-197">Trace</span></h3><dl class="class"><dt id="tracemalloc.Trace"><span class="yiyi-st" id="yiyi-198"> <em class="property">class </em><code class="descclassname">tracemalloc.</code><code class="descname">Trace</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-199">内存块的跟踪。</span></p><p><span class="yiyi-st" id="yiyi-200"><a class="reference internal" href="#tracemalloc.Snapshot.traces" title="tracemalloc.Snapshot.traces"><code class="xref py py-attr docutils literal"><span class="pre">Snapshot.traces</span></code></a>属性是<a class="reference internal" href="#tracemalloc.Trace" title="tracemalloc.Trace"><code class="xref py py-class docutils literal"><span class="pre">Trace</span></code></a>实例的序列。</span></p><dl class="attribute"><dt id="tracemalloc.Trace.size"><span class="yiyi-st" id="yiyi-201"> <code class="descname">size</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-202">内存块的大小(以字节为单位)(<code class="docutils literal"><span class="pre">int</span></code>)。</span></p></dd></dl><dl class="attribute"><dt id="tracemalloc.Trace.traceback"><span class="yiyi-st" id="yiyi-203"> <code class="descname">traceback</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-204">分配内存块的回溯,<a class="reference internal" href="#tracemalloc.Traceback" title="tracemalloc.Traceback"><code class="xref py py-class docutils literal"><span class="pre">Traceback</span></code></a>实例。</span></p></dd></dl></dd></dl></div><div class="section" id="traceback"><h3><span class="yiyi-st" id="yiyi-205">27.7.2.8. </span><span class="yiyi-st" id="yiyi-206">Traceback</span></h3><dl class="class"><dt id="tracemalloc.Traceback"><span class="yiyi-st" id="yiyi-207"> <em class="property">class </em><code class="descclassname">tracemalloc.</code><code class="descname">Traceback</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-208">从最近帧到最旧帧排序的<a class="reference internal" href="#tracemalloc.Frame" title="tracemalloc.Frame"><code class="xref py py-class docutils literal"><span class="pre">Frame</span></code></a>的序列。</span></p><p><span class="yiyi-st" id="yiyi-209">回溯至少包含<code class="docutils literal"><span class="pre">1</span></code>帧。</span><span class="yiyi-st" id="yiyi-210">如果<code class="docutils literal"><span class="pre">tracemalloc</span></code>模块未能获取帧,则使用行号<code class="docutils literal"><span class="pre">0</span></code>的文件名<code class="docutils literal"><span class="pre">"&lt;unknown&gt;"</span></code></span></p><p><span class="yiyi-st" id="yiyi-211">捕获快照时,跟踪的回溯限制为<a class="reference internal" href="#tracemalloc.get_traceback_limit" title="tracemalloc.get_traceback_limit"><code class="xref py py-func docutils literal"><span class="pre">get_traceback_limit()</span></code></a>帧。</span><span class="yiyi-st" id="yiyi-212">请参阅<a class="reference internal" href="#tracemalloc.take_snapshot" title="tracemalloc.take_snapshot"><code class="xref py py-func docutils literal"><span class="pre">take_snapshot()</span></code></a>函数。</span></p><p><span class="yiyi-st" id="yiyi-213"><a class="reference internal" href="#tracemalloc.Trace.traceback" title="tracemalloc.Trace.traceback"><code class="xref py py-attr docutils literal"><span class="pre">Trace.traceback</span></code></a>属性是<a class="reference internal" href="#tracemalloc.Traceback" title="tracemalloc.Traceback"><code class="xref py py-class docutils literal"><span class="pre">Traceback</span></code></a>实例的实例。</span></p><dl class="method"><dt id="tracemalloc.Traceback.format"><span class="yiyi-st" id="yiyi-214"> <code class="descname">format</code><span class="sig-paren">(</span><em>limit=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-215">将回溯格式设置为带换行符的行的列表。</span><span class="yiyi-st" id="yiyi-216">使用<a class="reference internal" href="linecache.html#module-linecache" title="linecache: This module provides random access to individual lines from text files."><code class="xref py py-mod docutils literal"><span class="pre">linecache</span></code></a>模块从源代码中检索行。</span><span class="yiyi-st" id="yiyi-217">如果设置<em>limit</em>,则仅格式化<em>限制</em>最近的帧。</span></p><p><span class="yiyi-st" id="yiyi-218">类似于<a class="reference internal" href="traceback.html#traceback.format_tb" title="traceback.format_tb"><code class="xref py py-func docutils literal"><span class="pre">traceback.format_tb()</span></code></a>函数,但<a class="reference internal" href="#tracemalloc.Traceback.format" title="tracemalloc.Traceback.format"><code class="xref py py-meth docutils literal"><span class="pre">format()</span></code></a>不包括换行符。</span></p><p><span class="yiyi-st" id="yiyi-219">例:</span></p><pre><code class="language-python"><span></span><span class="nb">print</span><span class="p">(</span><span class="s2">"Traceback (most recent call first):"</span><span class="p">)</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">traceback</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-220">输出:</span></p><pre><code class="language-python"><span></span><span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">first</span><span class="p">):</span>
<span class="n">File</span> <span class="s2">"test.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">9</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">Object</span><span class="p">()</span>
<span class="n">File</span> <span class="s2">"test.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">12</span>
<span class="n">tb</span> <span class="o">=</span> <span class="n">tracemalloc</span><span class="o">.</span><span class="n">get_object_traceback</span><span class="p">(</span><span class="n">f</span><span class="p">())</span>
</code></pre></dd></dl></dd></dl></div></div></div></div>