perf_profiling.html 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
  6. <meta property="og:title" content="Python support for the Linux perf profiler" />
  7. <meta property="og:type" content="website" />
  8. <meta property="og:url" content="https://docs.python.org/3/howto/perf_profiling.html" />
  9. <meta property="og:site_name" content="Python documentation" />
  10. <meta property="og:description" content="author, Pablo Galindo,. The Linux perf profiler is a very powerful tool that allows you to profile and obtain information about the performance of your application. perf also has a very vibrant eco..." />
  11. <meta property="og:image" content="https://docs.python.org/3/_static/og-image.png" />
  12. <meta property="og:image:alt" content="Python documentation" />
  13. <meta name="description" content="author, Pablo Galindo,. The Linux perf profiler is a very powerful tool that allows you to profile and obtain information about the performance of your application. perf also has a very vibrant eco..." />
  14. <meta property="og:image:width" content="200" />
  15. <meta property="og:image:height" content="200" />
  16. <meta name="theme-color" content="#3776ab" />
  17. <title>Python support for the Linux perf profiler &#8212; Python 3.12.0 documentation</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
  18. <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
  19. <link rel="stylesheet" type="text/css" href="../_static/pydoctheme.css?digest=b37c26da2f7529d09fe70b41c4b2133fe4931a90" />
  20. <link id="pygments_dark_css" media="(prefers-color-scheme: dark)" rel="stylesheet" type="text/css" href="../_static/pygments_dark.css" />
  21. <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
  22. <script src="../_static/jquery.js"></script>
  23. <script src="../_static/underscore.js"></script>
  24. <script src="../_static/doctools.js"></script>
  25. <script src="../_static/sidebar.js"></script>
  26. <link rel="search" type="application/opensearchdescription+xml"
  27. title="Search within Python 3.12.0 documentation"
  28. href="../_static/opensearch.xml"/>
  29. <link rel="author" title="About these documents" href="../about.html" />
  30. <link rel="index" title="Index" href="../genindex.html" />
  31. <link rel="search" title="Search" href="../search.html" />
  32. <link rel="copyright" title="Copyright" href="../copyright.html" />
  33. <link rel="next" title="Annotations Best Practices" href="annotations.html" />
  34. <link rel="prev" title="Instrumenting CPython with DTrace and SystemTap" href="instrumentation.html" />
  35. <link rel="canonical" href="https://docs.python.org/3/howto/perf_profiling.html" />
  36. <style>
  37. @media only screen {
  38. table.full-width-table {
  39. width: 100%;
  40. }
  41. }
  42. </style>
  43. <link rel="stylesheet" href="../_static/pydoctheme_dark.css" media="(prefers-color-scheme: dark)" id="pydoctheme_dark_css">
  44. <link rel="shortcut icon" type="image/png" href="../_static/py.svg" />
  45. <script type="text/javascript" src="../_static/copybutton.js"></script>
  46. <script type="text/javascript" src="../_static/menu.js"></script>
  47. <script type="text/javascript" src="../_static/themetoggle.js"></script>
  48. </head>
  49. <body>
  50. <div class="mobile-nav">
  51. <input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
  52. aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu" />
  53. <nav class="nav-content" role="navigation">
  54. <label for="menuToggler" class="toggler__label">
  55. <span></span>
  56. </label>
  57. <span class="nav-items-wrapper">
  58. <a href="https://www.python.org/" class="nav-logo">
  59. <img src="../_static/py.svg" alt="Logo"/>
  60. </a>
  61. <span class="version_switcher_placeholder"></span>
  62. <form role="search" class="search" action="../search.html" method="get">
  63. <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
  64. <path fill-rule="nonzero" fill="currentColor" d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
  65. </svg>
  66. <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" />
  67. <input type="submit" value="Go"/>
  68. </form>
  69. </span>
  70. </nav>
  71. <div class="menu-wrapper">
  72. <nav class="menu" role="navigation" aria-label="main navigation">
  73. <div class="language_switcher_placeholder"></div>
  74. <label class="theme-selector-label">
  75. Theme
  76. <select class="theme-selector" oninput="activateTheme(this.value)">
  77. <option value="auto" selected>Auto</option>
  78. <option value="light">Light</option>
  79. <option value="dark">Dark</option>
  80. </select>
  81. </label>
  82. <div>
  83. <h3><a href="../contents.html">Table of Contents</a></h3>
  84. <ul>
  85. <li><a class="reference internal" href="#">Python support for the Linux <code class="docutils literal notranslate"><span class="pre">perf</span></code> profiler</a><ul>
  86. <li><a class="reference internal" href="#how-to-enable-perf-profiling-support">How to enable <code class="docutils literal notranslate"><span class="pre">perf</span></code> profiling support</a></li>
  87. <li><a class="reference internal" href="#how-to-obtain-the-best-results">How to obtain the best results</a></li>
  88. </ul>
  89. </li>
  90. </ul>
  91. </div>
  92. <div>
  93. <h4>Previous topic</h4>
  94. <p class="topless"><a href="instrumentation.html"
  95. title="previous chapter">Instrumenting CPython with DTrace and SystemTap</a></p>
  96. </div>
  97. <div>
  98. <h4>Next topic</h4>
  99. <p class="topless"><a href="annotations.html"
  100. title="next chapter">Annotations Best Practices</a></p>
  101. </div>
  102. <div role="note" aria-label="source link">
  103. <h3>This Page</h3>
  104. <ul class="this-page-menu">
  105. <li><a href="../bugs.html">Report a Bug</a></li>
  106. <li>
  107. <a href="https://github.com/python/cpython/blob/main/Doc/howto/perf_profiling.rst"
  108. rel="nofollow">Show Source
  109. </a>
  110. </li>
  111. </ul>
  112. </div>
  113. </nav>
  114. </div>
  115. </div>
  116. <div class="related" role="navigation" aria-label="related navigation">
  117. <h3>Navigation</h3>
  118. <ul>
  119. <li class="right" style="margin-right: 10px">
  120. <a href="../genindex.html" title="General Index"
  121. accesskey="I">index</a></li>
  122. <li class="right" >
  123. <a href="../py-modindex.html" title="Python Module Index"
  124. >modules</a> |</li>
  125. <li class="right" >
  126. <a href="annotations.html" title="Annotations Best Practices"
  127. accesskey="N">next</a> |</li>
  128. <li class="right" >
  129. <a href="instrumentation.html" title="Instrumenting CPython with DTrace and SystemTap"
  130. accesskey="P">previous</a> |</li>
  131. <li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
  132. <li><a href="https://www.python.org/">Python</a> &#187;</li>
  133. <li class="switchers">
  134. <div class="language_switcher_placeholder"></div>
  135. <div class="version_switcher_placeholder"></div>
  136. </li>
  137. <li>
  138. </li>
  139. <li id="cpython-language-and-version">
  140. <a href="../index.html">3.12.0 Documentation</a> &#187;
  141. </li>
  142. <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Python HOWTOs</a> &#187;</li>
  143. <li class="nav-item nav-item-this"><a href="">Python support for the Linux <code class="docutils literal notranslate"><span class="pre">perf</span></code> profiler</a></li>
  144. <li class="right">
  145. <div class="inline-search" role="search">
  146. <form class="inline-search" action="../search.html" method="get">
  147. <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" />
  148. <input type="submit" value="Go" />
  149. </form>
  150. </div>
  151. |
  152. </li>
  153. <li class="right">
  154. <label class="theme-selector-label">
  155. Theme
  156. <select class="theme-selector" oninput="activateTheme(this.value)">
  157. <option value="auto" selected>Auto</option>
  158. <option value="light">Light</option>
  159. <option value="dark">Dark</option>
  160. </select>
  161. </label> |</li>
  162. </ul>
  163. </div>
  164. <div class="document">
  165. <div class="documentwrapper">
  166. <div class="bodywrapper">
  167. <div class="body" role="main">
  168. <section id="python-support-for-the-linux-perf-profiler">
  169. <span id="perf-profiling"></span><h1>Python support for the Linux <code class="docutils literal notranslate"><span class="pre">perf</span></code> profiler<a class="headerlink" href="#python-support-for-the-linux-perf-profiler" title="Permalink to this headline">¶</a></h1>
  170. <dl class="field-list simple">
  171. <dt class="field-odd">author</dt>
  172. <dd class="field-odd"><p>Pablo Galindo</p>
  173. </dd>
  174. </dl>
  175. <p><a class="reference external" href="https://perf.wiki.kernel.org">The Linux perf profiler</a>
  176. is a very powerful tool that allows you to profile and obtain
  177. information about the performance of your application.
  178. <code class="docutils literal notranslate"><span class="pre">perf</span></code> also has a very vibrant ecosystem of tools
  179. that aid with the analysis of the data that it produces.</p>
  180. <p>The main problem with using the <code class="docutils literal notranslate"><span class="pre">perf</span></code> profiler with Python applications is that
  181. <code class="docutils literal notranslate"><span class="pre">perf</span></code> only gets information about native symbols, that is, the names of
  182. functions and procedures written in C. This means that the names and file names
  183. of Python functions in your code will not appear in the output of <code class="docutils literal notranslate"><span class="pre">perf</span></code>.</p>
  184. <p>Since Python 3.12, the interpreter can run in a special mode that allows Python
  185. functions to appear in the output of the <code class="docutils literal notranslate"><span class="pre">perf</span></code> profiler. When this mode is
  186. enabled, the interpreter will interpose a small piece of code compiled on the
  187. fly before the execution of every Python function and it will teach <code class="docutils literal notranslate"><span class="pre">perf</span></code> the
  188. relationship between this piece of code and the associated Python function using
  189. <a class="reference internal" href="../c-api/perfmaps.html"><span class="doc">perf map files</span></a>.</p>
  190. <div class="admonition note">
  191. <p class="admonition-title">Note</p>
  192. <p>Support for the <code class="docutils literal notranslate"><span class="pre">perf</span></code> profiler is currently only available for Linux on
  193. select architectures. Check the output of the <code class="docutils literal notranslate"><span class="pre">configure</span></code> build step or
  194. check the output of <code class="docutils literal notranslate"><span class="pre">python</span> <span class="pre">-m</span> <span class="pre">sysconfig</span> <span class="pre">|</span> <span class="pre">grep</span> <span class="pre">HAVE_PERF_TRAMPOLINE</span></code>
  195. to see if your system is supported.</p>
  196. </div>
  197. <p>For example, consider the following script:</p>
  198. <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
  199. <span class="n">result</span> <span class="o">=</span> <span class="mi">0</span>
  200. <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
  201. <span class="n">result</span> <span class="o">+=</span> <span class="mi">1</span>
  202. <span class="k">return</span> <span class="n">result</span>
  203. <span class="k">def</span> <span class="nf">bar</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
  204. <span class="n">foo</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
  205. <span class="k">def</span> <span class="nf">baz</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
  206. <span class="n">bar</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
  207. <span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
  208. <span class="n">baz</span><span class="p">(</span><span class="mi">1000000</span><span class="p">)</span>
  209. </pre></div>
  210. </div>
  211. <p>We can run <code class="docutils literal notranslate"><span class="pre">perf</span></code> to sample CPU stack traces at 9999 hertz:</p>
  212. <div class="highlight-shell-session notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>perf<span class="w"> </span>record<span class="w"> </span>-F<span class="w"> </span><span class="m">9999</span><span class="w"> </span>-g<span class="w"> </span>-o<span class="w"> </span>perf.data<span class="w"> </span>python<span class="w"> </span>my_script.py
  213. </pre></div>
  214. </div>
  215. <p>Then we can use <code class="docutils literal notranslate"><span class="pre">perf</span> <span class="pre">report</span></code> to analyze the data:</p>
  216. <div class="highlight-shell-session notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>perf<span class="w"> </span>report<span class="w"> </span>--stdio<span class="w"> </span>-n<span class="w"> </span>-g
  217. <span class="gp"># </span>Children<span class="w"> </span>Self<span class="w"> </span>Samples<span class="w"> </span>Command<span class="w"> </span>Shared<span class="w"> </span>Object<span class="w"> </span>Symbol
  218. <span class="gp"># </span>........<span class="w"> </span>........<span class="w"> </span>............<span class="w"> </span>..........<span class="w"> </span>..................<span class="w"> </span>..........................................
  219. <span class="gp">#</span>
  220. <span class="go"> 91.08% 0.00% 0 python.exe python.exe [.] _start</span>
  221. <span class="go"> |</span>
  222. <span class="go"> ---_start</span>
  223. <span class="go"> |</span>
  224. <span class="go"> --90.71%--__libc_start_main</span>
  225. <span class="go"> Py_BytesMain</span>
  226. <span class="go"> |</span>
  227. <span class="go"> |--56.88%--pymain_run_python.constprop.0</span>
  228. <span class="go"> | |</span>
  229. <span class="go"> | |--56.13%--_PyRun_AnyFileObject</span>
  230. <span class="go"> | | _PyRun_SimpleFileObject</span>
  231. <span class="go"> | | |</span>
  232. <span class="go"> | | |--55.02%--run_mod</span>
  233. <span class="go"> | | | |</span>
  234. <span class="go"> | | | --54.65%--PyEval_EvalCode</span>
  235. <span class="go"> | | | _PyEval_EvalFrameDefault</span>
  236. <span class="go"> | | | PyObject_Vectorcall</span>
  237. <span class="go"> | | | _PyEval_Vector</span>
  238. <span class="go"> | | | _PyEval_EvalFrameDefault</span>
  239. <span class="go"> | | | PyObject_Vectorcall</span>
  240. <span class="go"> | | | _PyEval_Vector</span>
  241. <span class="go"> | | | _PyEval_EvalFrameDefault</span>
  242. <span class="go"> | | | PyObject_Vectorcall</span>
  243. <span class="go"> | | | _PyEval_Vector</span>
  244. <span class="go"> | | | |</span>
  245. <span class="go"> | | | |--51.67%--_PyEval_EvalFrameDefault</span>
  246. <span class="go"> | | | | |</span>
  247. <span class="go"> | | | | |--11.52%--_PyLong_Add</span>
  248. <span class="go"> | | | | | |</span>
  249. <span class="go"> | | | | | |--2.97%--_PyObject_Malloc</span>
  250. <span class="go">...</span>
  251. </pre></div>
  252. </div>
  253. <p>As you can see, the Python functions are not shown in the output, only <code class="docutils literal notranslate"><span class="pre">_Py_Eval_EvalFrameDefault</span></code>
  254. (the function that evaluates the Python bytecode) shows up. Unfortunately that’s not very useful because all Python
  255. functions use the same C function to evaluate bytecode so we cannot know which Python function corresponds to which
  256. bytecode-evaluating function.</p>
  257. <p>Instead, if we run the same experiment with <code class="docutils literal notranslate"><span class="pre">perf</span></code> support enabled we get:</p>
  258. <div class="highlight-shell-session notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>perf<span class="w"> </span>report<span class="w"> </span>--stdio<span class="w"> </span>-n<span class="w"> </span>-g
  259. <span class="gp"># </span>Children<span class="w"> </span>Self<span class="w"> </span>Samples<span class="w"> </span>Command<span class="w"> </span>Shared<span class="w"> </span>Object<span class="w"> </span>Symbol
  260. <span class="gp"># </span>........<span class="w"> </span>........<span class="w"> </span>............<span class="w"> </span>..........<span class="w"> </span>..................<span class="w"> </span>.....................................................................
  261. <span class="gp">#</span>
  262. <span class="go"> 90.58% 0.36% 1 python.exe python.exe [.] _start</span>
  263. <span class="go"> |</span>
  264. <span class="go"> ---_start</span>
  265. <span class="go"> |</span>
  266. <span class="go"> --89.86%--__libc_start_main</span>
  267. <span class="go"> Py_BytesMain</span>
  268. <span class="go"> |</span>
  269. <span class="go"> |--55.43%--pymain_run_python.constprop.0</span>
  270. <span class="go"> | |</span>
  271. <span class="go"> | |--54.71%--_PyRun_AnyFileObject</span>
  272. <span class="go"> | | _PyRun_SimpleFileObject</span>
  273. <span class="go"> | | |</span>
  274. <span class="go"> | | |--53.62%--run_mod</span>
  275. <span class="go"> | | | |</span>
  276. <span class="go"> | | | --53.26%--PyEval_EvalCode</span>
  277. <span class="go"> | | | py::&lt;module&gt;:/src/script.py</span>
  278. <span class="go"> | | | _PyEval_EvalFrameDefault</span>
  279. <span class="go"> | | | PyObject_Vectorcall</span>
  280. <span class="go"> | | | _PyEval_Vector</span>
  281. <span class="go"> | | | py::baz:/src/script.py</span>
  282. <span class="go"> | | | _PyEval_EvalFrameDefault</span>
  283. <span class="go"> | | | PyObject_Vectorcall</span>
  284. <span class="go"> | | | _PyEval_Vector</span>
  285. <span class="go"> | | | py::bar:/src/script.py</span>
  286. <span class="go"> | | | _PyEval_EvalFrameDefault</span>
  287. <span class="go"> | | | PyObject_Vectorcall</span>
  288. <span class="go"> | | | _PyEval_Vector</span>
  289. <span class="go"> | | | py::foo:/src/script.py</span>
  290. <span class="go"> | | | |</span>
  291. <span class="go"> | | | |--51.81%--_PyEval_EvalFrameDefault</span>
  292. <span class="go"> | | | | |</span>
  293. <span class="go"> | | | | |--13.77%--_PyLong_Add</span>
  294. <span class="go"> | | | | | |</span>
  295. <span class="go"> | | | | | |--3.26%--_PyObject_Malloc</span>
  296. </pre></div>
  297. </div>
  298. <section id="how-to-enable-perf-profiling-support">
  299. <h2>How to enable <code class="docutils literal notranslate"><span class="pre">perf</span></code> profiling support<a class="headerlink" href="#how-to-enable-perf-profiling-support" title="Permalink to this headline">¶</a></h2>
  300. <p><code class="docutils literal notranslate"><span class="pre">perf</span></code> profiling support can be enabled either from the start using
  301. the environment variable <span class="target" id="index-0"></span><a class="reference internal" href="../using/cmdline.html#envvar-PYTHONPERFSUPPORT"><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYTHONPERFSUPPORT</span></code></a> or the
  302. <a class="reference internal" href="../using/cmdline.html#cmdoption-X"><code class="xref std std-option docutils literal notranslate"><span class="pre">-X</span> <span class="pre">perf</span></code></a> option,
  303. or dynamically using <a class="reference internal" href="../library/sys.html#sys.activate_stack_trampoline" title="sys.activate_stack_trampoline"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.activate_stack_trampoline()</span></code></a> and
  304. <a class="reference internal" href="../library/sys.html#sys.deactivate_stack_trampoline" title="sys.deactivate_stack_trampoline"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.deactivate_stack_trampoline()</span></code></a>.</p>
  305. <p>The <code class="xref py py-mod docutils literal notranslate"><span class="pre">sys</span></code> functions take precedence over the <code class="xref std std-option docutils literal notranslate"><span class="pre">-X</span></code> option,
  306. the <code class="xref std std-option docutils literal notranslate"><span class="pre">-X</span></code> option takes precedence over the environment variable.</p>
  307. <p>Example, using the environment variable:</p>
  308. <div class="highlight-shell-session notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span><span class="nv">PYTHONPERFSUPPORT</span><span class="o">=</span><span class="m">1</span>
  309. <span class="gp">$ </span>python<span class="w"> </span>script.py
  310. <span class="gp">$ </span>perf<span class="w"> </span>report<span class="w"> </span>-g<span class="w"> </span>-i<span class="w"> </span>perf.data
  311. </pre></div>
  312. </div>
  313. <p>Example, using the <code class="xref std std-option docutils literal notranslate"><span class="pre">-X</span></code> option:</p>
  314. <div class="highlight-shell-session notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>python<span class="w"> </span>-X<span class="w"> </span>perf<span class="w"> </span>script.py
  315. <span class="gp">$ </span>perf<span class="w"> </span>report<span class="w"> </span>-g<span class="w"> </span>-i<span class="w"> </span>perf.data
  316. </pre></div>
  317. </div>
  318. <p>Example, using the <a class="reference internal" href="../library/sys.html#module-sys" title="sys: Access system-specific parameters and functions."><code class="xref py py-mod docutils literal notranslate"><span class="pre">sys</span></code></a> APIs in file <code class="file docutils literal notranslate"><span class="pre">example.py</span></code>:</p>
  319. <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
  320. <span class="n">sys</span><span class="o">.</span><span class="n">activate_stack_trampoline</span><span class="p">(</span><span class="s2">&quot;perf&quot;</span><span class="p">)</span>
  321. <span class="n">do_profiled_stuff</span><span class="p">()</span>
  322. <span class="n">sys</span><span class="o">.</span><span class="n">deactivate_stack_trampoline</span><span class="p">()</span>
  323. <span class="n">non_profiled_stuff</span><span class="p">()</span>
  324. </pre></div>
  325. </div>
  326. <p>…then:</p>
  327. <div class="highlight-shell-session notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>python<span class="w"> </span>./example.py
  328. <span class="gp">$ </span>perf<span class="w"> </span>report<span class="w"> </span>-g<span class="w"> </span>-i<span class="w"> </span>perf.data
  329. </pre></div>
  330. </div>
  331. </section>
  332. <section id="how-to-obtain-the-best-results">
  333. <h2>How to obtain the best results<a class="headerlink" href="#how-to-obtain-the-best-results" title="Permalink to this headline">¶</a></h2>
  334. <p>For best results, Python should be compiled with
  335. <code class="docutils literal notranslate"><span class="pre">CFLAGS=&quot;-fno-omit-frame-pointer</span> <span class="pre">-mno-omit-leaf-frame-pointer&quot;</span></code> as this allows
  336. profilers to unwind using only the frame pointer and not on DWARF debug
  337. information. This is because as the code that is interposed to allow <code class="docutils literal notranslate"><span class="pre">perf</span></code>
  338. support is dynamically generated it doesn’t have any DWARF debugging information
  339. available.</p>
  340. <p>You can check if your system has been compiled with this flag by running:</p>
  341. <div class="highlight-shell-session notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>python<span class="w"> </span>-m<span class="w"> </span>sysconfig<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span><span class="s1">&#39;no-omit-frame-pointer&#39;</span>
  342. </pre></div>
  343. </div>
  344. <p>If you don’t see any output it means that your interpreter has not been compiled with
  345. frame pointers and therefore it may not be able to show Python functions in the output
  346. of <code class="docutils literal notranslate"><span class="pre">perf</span></code>.</p>
  347. </section>
  348. </section>
  349. <div class="clearer"></div>
  350. </div>
  351. </div>
  352. </div>
  353. <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
  354. <div class="sphinxsidebarwrapper">
  355. <div>
  356. <h3><a href="../contents.html">Table of Contents</a></h3>
  357. <ul>
  358. <li><a class="reference internal" href="#">Python support for the Linux <code class="docutils literal notranslate"><span class="pre">perf</span></code> profiler</a><ul>
  359. <li><a class="reference internal" href="#how-to-enable-perf-profiling-support">How to enable <code class="docutils literal notranslate"><span class="pre">perf</span></code> profiling support</a></li>
  360. <li><a class="reference internal" href="#how-to-obtain-the-best-results">How to obtain the best results</a></li>
  361. </ul>
  362. </li>
  363. </ul>
  364. </div>
  365. <div>
  366. <h4>Previous topic</h4>
  367. <p class="topless"><a href="instrumentation.html"
  368. title="previous chapter">Instrumenting CPython with DTrace and SystemTap</a></p>
  369. </div>
  370. <div>
  371. <h4>Next topic</h4>
  372. <p class="topless"><a href="annotations.html"
  373. title="next chapter">Annotations Best Practices</a></p>
  374. </div>
  375. <div role="note" aria-label="source link">
  376. <h3>This Page</h3>
  377. <ul class="this-page-menu">
  378. <li><a href="../bugs.html">Report a Bug</a></li>
  379. <li>
  380. <a href="https://github.com/python/cpython/blob/main/Doc/howto/perf_profiling.rst"
  381. rel="nofollow">Show Source
  382. </a>
  383. </li>
  384. </ul>
  385. </div>
  386. </div>
  387. </div>
  388. <div class="clearer"></div>
  389. </div>
  390. <div class="related" role="navigation" aria-label="related navigation">
  391. <h3>Navigation</h3>
  392. <ul>
  393. <li class="right" style="margin-right: 10px">
  394. <a href="../genindex.html" title="General Index"
  395. >index</a></li>
  396. <li class="right" >
  397. <a href="../py-modindex.html" title="Python Module Index"
  398. >modules</a> |</li>
  399. <li class="right" >
  400. <a href="annotations.html" title="Annotations Best Practices"
  401. >next</a> |</li>
  402. <li class="right" >
  403. <a href="instrumentation.html" title="Instrumenting CPython with DTrace and SystemTap"
  404. >previous</a> |</li>
  405. <li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
  406. <li><a href="https://www.python.org/">Python</a> &#187;</li>
  407. <li class="switchers">
  408. <div class="language_switcher_placeholder"></div>
  409. <div class="version_switcher_placeholder"></div>
  410. </li>
  411. <li>
  412. </li>
  413. <li id="cpython-language-and-version">
  414. <a href="../index.html">3.12.0 Documentation</a> &#187;
  415. </li>
  416. <li class="nav-item nav-item-1"><a href="index.html" >Python HOWTOs</a> &#187;</li>
  417. <li class="nav-item nav-item-this"><a href="">Python support for the Linux <code class="docutils literal notranslate"><span class="pre">perf</span></code> profiler</a></li>
  418. <li class="right">
  419. <div class="inline-search" role="search">
  420. <form class="inline-search" action="../search.html" method="get">
  421. <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" />
  422. <input type="submit" value="Go" />
  423. </form>
  424. </div>
  425. |
  426. </li>
  427. <li class="right">
  428. <label class="theme-selector-label">
  429. Theme
  430. <select class="theme-selector" oninput="activateTheme(this.value)">
  431. <option value="auto" selected>Auto</option>
  432. <option value="light">Light</option>
  433. <option value="dark">Dark</option>
  434. </select>
  435. </label> |</li>
  436. </ul>
  437. </div>
  438. <div class="footer">
  439. &copy; <a href="../copyright.html">Copyright</a> 2001-2023, Python Software Foundation.
  440. <br />
  441. This page is licensed under the Python Software Foundation License Version 2.
  442. <br />
  443. Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
  444. <br />
  445. See <a href="/license.html">History and License</a> for more information.<br />
  446. <br />
  447. The Python Software Foundation is a non-profit corporation.
  448. <a href="https://www.python.org/psf/donations/">Please donate.</a>
  449. <br />
  450. <br />
  451. Last updated on Oct 02, 2023.
  452. <a href="/bugs.html">Found a bug</a>?
  453. <br />
  454. Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.5.0.
  455. </div>
  456. </body>
  457. </html>