{
    "componentChunkName": "component---src-templates-post-template-tsx",
    "path": "/python-profile/",
    "result": {"data":{"site":{"siteMetadata":{"siteUrl":"https://facerain.github.io"}},"allMarkdownRemark":{"edges":[{"node":{"id":"9f58ef31-2732-5ec9-92b8-3442205432a4","html":"<h2 id=\"들어가며\" style=\"position:relative;\"><a href=\"#%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0\" aria-label=\"들어가며 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>들어가며,</h2>\n<p>이번 시간에는 <strong>파이썬에서 프로파일링을 수행하는 방법</strong>에 대해서 간단하게 알아봅니다.</p>\n<blockquote>\n<p><strong>“최적화하기 전에 프로파일링을 하라.”</strong> - Effective Python 2nd 중</p>\n</blockquote>\n<p>SW 개발에서 기능 개발만큼이나 중요한 것은 최적화와 유지보수입니다. 이때 현재 시스템의 연산 및 메모리 사용량 등을 확인하고 분석할 필요가 있는데, 이 과정을 프로파일링이라고 합니다.</p>\n<h2 id=\"파이썬에서-프로파일링-수행하기\" style=\"position:relative;\"><a href=\"#%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%97%90%EC%84%9C-%ED%94%84%EB%A1%9C%ED%8C%8C%EC%9D%BC%EB%A7%81-%EC%88%98%ED%96%89%ED%95%98%EA%B8%B0\" aria-label=\"파이썬에서 프로파일링 수행하기 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>파이썬에서 프로파일링 수행하기</h2>\n<p>파이썬에서는 기본 라이브러리로 <code class=\"language-text\">profile</code>과 <code class=\"language-text\">cProfile</code>을 지원합니다.\n두 라이브러리의 자세한 차이점은 <a href=\"https://www.w3resource.com/python-interview/what-is-the-difference-between-the-cprofile-and-profile-modules-in-python.php\" target=\"_blank\" rel=\"nofollow\">링크</a>를 참고해보세요!</p>\n<p>아래 코드는 피보나치를 구하는 두 가지 버전과 cProfile을 이용하여 프로파일링하는 코드 예제입니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-python line-numbers\"><code class=\"language-python\"><span class=\"token keyword\">from</span> cProfile <span class=\"token keyword\">import</span> Profile\n<span class=\"token keyword\">from</span> pstats <span class=\"token keyword\">import</span> Stats\n\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">fibonacci_dp</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    dp <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> n <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        dp<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>dp<span class=\"token punctuation\">[</span>i <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> dp<span class=\"token punctuation\">[</span>i <span class=\"token operator\">-</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> dp<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span>\n\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">fibonacci_recursion</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">if</span> n <span class=\"token operator\">&lt;=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> n\n    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> fibonacci_recursion<span class=\"token punctuation\">(</span>n <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> fibonacci_recursion<span class=\"token punctuation\">(</span>n <span class=\"token operator\">-</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">test</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    num <span class=\"token operator\">=</span> <span class=\"token number\">35</span>\n    fibonacci_dp<span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span>\n    fibonacci_recursion<span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span>\n\n\nprofiler <span class=\"token operator\">=</span> Profile<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\nprofiler<span class=\"token punctuation\">.</span>runcall<span class=\"token punctuation\">(</span>test<span class=\"token punctuation\">)</span>\n\nstats <span class=\"token operator\">=</span> Stats<span class=\"token punctuation\">(</span>profiler<span class=\"token punctuation\">)</span>\nstats<span class=\"token punctuation\">.</span>strip_dirs<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\nstats<span class=\"token punctuation\">.</span>sort_stats<span class=\"token punctuation\">(</span><span class=\"token string\">\"cumulative\"</span><span class=\"token punctuation\">)</span>\nstats<span class=\"token punctuation\">.</span>print_stats<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>프로파일링한 결과는 아래와 같습니다. 결과를 살펴보면 함수 호출 횟수와 소요 시간들을 확인할 수 있습니다. 이를 통해 간단하게 dp버전과 재귀 버전의 로직의 소요 시간을 비교해볼 수 있습니다.</p>\n<p><figure class=\"gatsby-resp-image-figure\" style=\"\">\n    <span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 727px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/e416c522be164e8763836265b2940c7a/96343/2.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.208333333333332%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA/UlEQVQY02VR2VLDMAzs10BL4trxkTg+cjRpE0phhv//mGWktEwHHtaSLO1KlneFdJCNQ+gX9NMn4vAOZTOOOkC5jMplSJNw1JEt5ej+ICxeC4N9aRkPf0eOqCIq13GhrjsWKZXngoNwDCYKwlP8hF/BfWk2MZth2xG67jkmYWkTT0XWND03qu55Ir+86X9T7oQOaNLMpDRe4cLpbif4fEYTZ3TTDXn8QOhX5OmG4fwF64etmUl/J7T8PBImomtHhGFFHWeEboHvFpyWb6Thyjtu84Wx7XtlQVG1KGSzTUgHgfZCH0GJUrUolOdGhAdJmsj3VEsxCynPPKojwR8TCsIekRvSTgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/e416c522be164e8763836265b2940c7a/a59e9/2.webp 192w,\n/static/e416c522be164e8763836265b2940c7a/0ca9f/2.webp 384w,\n/static/e416c522be164e8763836265b2940c7a/c55bc/2.webp 727w\"\n              sizes=\"(max-width: 727px) 100vw, 727px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/e416c522be164e8763836265b2940c7a/3b721/2.png 192w,\n/static/e416c522be164e8763836265b2940c7a/66595/2.png 384w,\n/static/e416c522be164e8763836265b2940c7a/96343/2.png 727w\"\n            sizes=\"(max-width: 727px) 100vw, 727px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/e416c522be164e8763836265b2940c7a/96343/2.png\"\n            alt=\"2\"\n            title=\"프로파일링 결과\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span>\n    <figcaption class=\"gatsby-resp-image-figcaption\">프로파일링 결과</figcaption>\n  </figure></p>\n<h2 id=\"마치며\" style=\"position:relative;\"><a href=\"#%EB%A7%88%EC%B9%98%EB%A9%B0\" aria-label=\"마치며 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>마치며</h2>\n<p>지금까지 간단하게 cProfile을 이용하여 파이썬 프로파일링하는 방법을 알아보았습니다. 이를 통해 프로파일링을 수행하고, 최적화를 통해 시스템을 개선할 수 있습니다. 이외에도 메모리를 프로파일링 하기 위한 <a href=\"https://docs.python.org/3/library/tracemalloc.html\" target=\"_blank\" rel=\"nofollow\">tracemalloc</a>, <a href=\"https://pypi.org/project/memory-profiler/\" target=\"_blank\" rel=\"nofollow\">memory_profiler</a> 개별 함수를 라인 별로 프로파일링 할 수 있는 <a href=\"https://github.com/pyutils/line_profiler\" target=\"_blank\" rel=\"nofollow\">line_profile</a> 등이 있으니, 한번 살펴보시는 것도 추천드립니다! 감사합니다</p>","tableOfContents":"<ul>\n<li><a href=\"#%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0\">들어가며,</a></li>\n<li><a href=\"#%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%97%90%EC%84%9C-%ED%94%84%EB%A1%9C%ED%8C%8C%EC%9D%BC%EB%A7%81-%EC%88%98%ED%96%89%ED%95%98%EA%B8%B0\">파이썬에서 프로파일링 수행하기</a></li>\n<li><a href=\"#%EB%A7%88%EC%B9%98%EB%A9%B0\">마치며</a></li>\n</ul>","frontmatter":{"title":"Python에서 프로파일링 하는 법","summary":"Python에서 프로파일링을 수행하는 방법에 대해 알아봅시다.","date":"2024.03.24.","categories":["Tip","Development"],"thumbnail":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAIBAwT/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQME/9oADAMBAAIQAxAAAAHK6zthWAP/xAAXEAADAQAAAAAAAAAAAAAAAAAAAREg/9oACAEBAAEFAkTP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFBABAAAAAAAAAAAAAAAAAAAAIP/aAAgBAQAGPwJf/8QAFxABAQEBAAAAAAAAAAAAAAAAAQAxQf/aAAgBAQABPyEzHYeTO3//2gAMAwEAAgADAAAAEMgP/8QAFhEAAwAAAAAAAAAAAAAAAAAAARAx/9oACAEDAQE/EDV//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGRABAAMBAQAAAAAAAAAAAAAAAQARIUFx/9oACAEBAAE/EL8C4AanhsJDW2oOEWRx/9k=","aspectRatio":1.7699115044247788,"src":"/static/e8a958bd46206c75eaa2ffc75353ed88/addc4/th.jpg","srcSet":"/static/e8a958bd46206c75eaa2ffc75353ed88/ae57a/th.jpg 200w,\n/static/e8a958bd46206c75eaa2ffc75353ed88/86652/th.jpg 400w,\n/static/e8a958bd46206c75eaa2ffc75353ed88/addc4/th.jpg 800w,\n/static/e8a958bd46206c75eaa2ffc75353ed88/7d728/th.jpg 1200w,\n/static/e8a958bd46206c75eaa2ffc75353ed88/9feb0/th.jpg 1280w","srcWebp":"/static/e8a958bd46206c75eaa2ffc75353ed88/210fa/th.webp","srcSetWebp":"/static/e8a958bd46206c75eaa2ffc75353ed88/8444f/th.webp 200w,\n/static/e8a958bd46206c75eaa2ffc75353ed88/42fc5/th.webp 400w,\n/static/e8a958bd46206c75eaa2ffc75353ed88/210fa/th.webp 800w,\n/static/e8a958bd46206c75eaa2ffc75353ed88/3058d/th.webp 1200w,\n/static/e8a958bd46206c75eaa2ffc75353ed88/73f24/th.webp 1280w","sizes":"(max-width: 800px) 100vw, 800px"}},"publicURL":"/static/e8a958bd46206c75eaa2ffc75353ed88/th.jpg"}}}}]}},"pageContext":{"slug":"/python-profile/"}},
    "staticQueryHashes": []}