mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 06:55:36 +08:00
162 lines
86 KiB
HTML
162 lines
86 KiB
HTML
<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"><</span><span class="n">frozen</span> <span class="n">importlib</span><span class="o">.</span><span class="n">_bootstrap</span><span class="o">></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"><</span><span class="n">frozen</span> <span class="n">importlib</span><span class="o">.</span><span class="n">_bootstrap</span><span class="o">></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"><</span><span class="n">frozen</span> <span class="n">importlib</span><span class="o">.</span><span class="n">_bootstrap</span><span class="o">></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"><</span><span class="n">frozen</span> <span class="n">importlib</span><span class="o">.</span><span class="n">_bootstrap</span><span class="o">></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"><</span><span class="n">string</span><span class="o">></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"><</span><span class="n">frozen</span> <span class="n">importlib</span><span class="o">.</span><span class="n">_bootstrap</span><span class="o">></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"><</span><span class="n">frozen</span> <span class="n">importlib</span><span class="o">.</span><span class="n">_bootstrap</span><span class="o">></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">"<frozen importlib._bootstrap>"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">716</span>
|
||
<span class="n">File</span> <span class="s2">"<frozen importlib._bootstrap>"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1036</span>
|
||
<span class="n">File</span> <span class="s2">"<frozen importlib._bootstrap>"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">934</span>
|
||
<span class="n">File</span> <span class="s2">"<frozen importlib._bootstrap>"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1068</span>
|
||
<span class="n">File</span> <span class="s2">"<frozen importlib._bootstrap>"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">619</span>
|
||
<span class="n">File</span> <span class="s2">"<frozen importlib._bootstrap>"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1581</span>
|
||
<span class="n">File</span> <span class="s2">"<frozen importlib._bootstrap>"</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">"<frozen importlib._bootstrap>"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">284</span>
|
||
<span class="n">File</span> <span class="s2">"<frozen importlib._bootstrap>"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">938</span>
|
||
<span class="n">File</span> <span class="s2">"<frozen importlib._bootstrap>"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1068</span>
|
||
<span class="n">File</span> <span class="s2">"<frozen importlib._bootstrap>"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">619</span>
|
||
<span class="n">File</span> <span class="s2">"<frozen importlib._bootstrap>"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1581</span>
|
||
<span class="n">File</span> <span class="s2">"<frozen importlib._bootstrap>"</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._bootstrap&gt;</span></code>和<code class="docutils literal"><span class="pre"><unknown></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">"<frozen importlib._bootstrap>"</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">"<unknown>"</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: <string>: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">"<unknown>"</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> |