"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > cProfile 및 PyPy 모듈을 사용하여 Python 코드 최적화: 전체 가이드

cProfile 및 PyPy 모듈을 사용하여 Python 코드 최적화: 전체 가이드

2024-11-07에 게시됨
검색:880

Optimizing Python Code Using cProfile and PyPy module: A Complete Guide

소개

Python 개발자로서 우리는 코드 최적화에 대해 걱정하기 전에 코드를 작동시키는 데 집중하는 경우가 많습니다. 그러나 대규모 애플리케이션이나 성능이 중요한 코드를 처리할 때는 최적화가 중요합니다. 이 게시물에서는 Python 코드를 최적화하는 데 사용할 수 있는 두 가지 강력한 도구인 cProfile 모듈과 PyPy 인터프리터에 대해 설명합니다.

이 게시물이 끝나면 다음 내용을 배우게 됩니다.

  1. cProfile 모듈을 사용하여 성능 병목 현상을 식별하는 방법
  2. 속도를 위해 코드를 최적화하는 방법.
  3. PyPy를 사용하여 JIT(Just-in-Time) 컴파일로 Python 프로그램을 더욱 가속화하는 방법

성능 최적화가 중요한 이유

Python은 사용 용이성, 가독성, 방대한 라이브러리 생태계로 유명합니다. 그러나 해석된 특성으로 인해 C나 Java와 같은 다른 언어보다 속도도 느립니다. 따라서 Python 코드를 최적화하는 방법을 아는 것은 기계 학습 모델, 실시간 시스템 또는 고빈도 거래 시스템과 같이 성능에 민감한 애플리케이션에서 매우 중요할 수 있습니다.

최적화는 일반적으로 다음 단계를 따릅니다.

  1. 코드를 프로파일링하여 병목 현상이 발생한 위치를 파악하세요.
  2. 비효율적인 부분에서는 코드를 최적화하세요.
  3. PyPy와 같은 더 빠른 인터프리터에서 최적화된 코드를 실행하여 최대 성능을 달성하세요.

이제 코드 프로파일링부터 시작해 보겠습니다.

1단계: cProfile을 사용하여 코드 프로파일링

c프로파일이란 무엇입니까?

cProfile은 성능 프로파일링을 위해 내장된 Python 모듈입니다. 코드의 각 함수를 실행하는 데 걸리는 시간을 추적하여 속도 저하를 일으키는 함수나 코드 섹션을 식별하는 데 도움이 됩니다.

명령줄에서 cProfile 사용

스크립트를 프로파일링하는 가장 간단한 방법은 명령줄에서 cProfile을 실행하는 것입니다. 예를 들어 my_script.py:
라는 스크립트가 있다고 가정해 보겠습니다.

python -m cProfile -s cumulative my_script.py

설명:

  • -m cProfile: Python 표준 라이브러리의 일부로 cProfile 모듈을 실행합니다.
  • -s cumulative: 각 기능에 소요된 누적 시간을 기준으로 프로파일링 결과를 정렬합니다.
  • my_script.py: Python 스크립트.

이렇게 하면 코드가 시간을 소비하는 위치에 대한 자세한 분석이 생성됩니다.

예: Python 스크립트 프로파일링

피보나치 수를 재귀적으로 계산하는 기본 Python 스크립트를 살펴보겠습니다.

def fibonacci(n):
    if n 



cProfile을 사용하여 이 스크립트 실행:

python -m cProfile -s cumulative fibonacci_script.py

cProfile 출력 이해

cProfile을 실행하면 다음과 같은 내용이 표시됩니다.

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     8320    0.050    0.000    0.124    0.000 fibonacci_script.py:3(fibonacci)

각 열은 주요 성과 데이터를 제공합니다.

  • ncalls: 함수가 호출된 횟수입니다.
  • tottime: 해당 기능에 소요된 총 시간(하위 기능 제외).
  • cumtime: 해당 기능(하위 기능 포함)에서 소비한 누적 시간입니다.
  • percall: 통화당 시간입니다.

피보나치 함수에 시간이 너무 많이 걸리는 경우 이 출력은 최적화 노력에 집중해야 할 부분을 보여줍니다.

코드의 특정 부분 프로파일링

특정 섹션만 프로파일링하려는 경우 코드 내에서 프로그래밍 방식으로 cProfile을 사용할 수도 있습니다.

import cProfile

def fibonacci(n):
    if n 



2단계: Python 코드 최적화

cProfile을 사용하여 코드의 병목 현상을 식별한 후에는 최적화할 시간입니다.

일반적인 Python 최적화 기술

  1. 내장 함수 사용: sum(), min(), max()와 같은 내장 함수는 Python에서 고도로 최적화되어 있으며 일반적으로 수동으로 구현한 루프보다 빠릅니다.

예:

   # Before: Custom sum loop
   total = 0
   for i in range(1000000):
       total  = i

   # After: Using built-in sum
   total = sum(range(1000000))
  1. 불필요한 함수 호출 방지: 함수 호출에는 특히 루프 내부에 오버헤드가 있습니다. 중복되는 통화를 줄여보세요.

예:

   # Before: Unnecessary repeated calculations
   for i in range(1000):
       print(len(my_list))  # len() is called 1000 times

   # After: Compute once and reuse
   list_len = len(my_list)
   for i in range(1000):
       print(list_len)
  1. 메모이제이션: 재귀 함수의 경우 메모이제이션을 사용하여 비용이 많이 드는 계산 결과를 저장하여 반복 작업을 피할 수 있습니다.

예:

   from functools import lru_cache

   @lru_cache(maxsize=None)
   def fibonacci(n):
       if n 



이는 각 재귀 호출의 결과를 저장하여 피보나치 계산 속도를 크게 향상시킵니다.

3단계: JIT(Just-In-Time) 컴파일을 위해 PyPy 사용

PyPy란 무엇입니까?

PyPy는 JIT(Just-in-Time) 컴파일을 사용하여 Python 코드를 가속화하는 대체 Python 인터프리터입니다. PyPy는 자주 실행되는 코드 경로를 기계어 코드로 컴파일하여 특정 작업에 대한 표준 CPython 인터프리터보다 훨씬 빠릅니다.

PyPy 설치

Linux에서는 apt와 같은 패키지 관리자를 사용하고 macOS에서는 Brew와 같은 패키지 관리자를 사용하여 PyPy를 설치할 수 있습니다.

# On Ubuntu
sudo apt-get install pypy3

# On macOS (using Homebrew)
brew install pypy3

PyPy로 Python 코드 실행

PyPy가 설치되면 CPython 대신 PyPy로 스크립트를 실행할 수 있습니다.

pypy3 my_script.py

왜 PyPy를 사용하는가?

  • PyPy는 프로그램이 대부분의 시간을 계산(예: 루프, 재귀 함수, 숫자 처리)에 소비하는 CPU 기반 작업에 이상적입니다.
  • PyPy의 JIT 컴파일러는 가장 자주 실행되는 코드 경로를 최적화하여 코드 변경 없이 상당한 속도 향상을 가져올 수 있습니다.

4단계: 최대 최적화를 위해 cProfile과 PyPy 결합

이제 이러한 도구를 결합하여 Python 코드를 완전히 최적화해 보겠습니다.

예시 워크플로우

  1. cProfile을 사용하여 코드를 프로파일링하여 병목 현상을 식별하세요.
  2. 우리가 논의한 기술(내장, 메모, 불필요한 함수 호출 방지)을 사용하여 코드를 최적화하세요.
  3. PyPy로 최적화된 코드를 실행하여 추가 성능 향상을 달성하세요.

피보나치 예시를 다시 살펴보고 모든 것을 하나로 모아보겠습니다.

from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci(n):
    if n 



메모이제이션으로 코드를 최적화한 후 추가 성능 개선을 위해 PyPy를 사용하여 실행하세요.

pypy3 fibonacci_script.py

결론

cProfile과 PyPy를 활용하면 Python 코드를 크게 최적화할 수 있습니다. cProfile을 사용하여 코드의 성능 병목 현상을 식별하고 해결하세요. 그런 다음 PyPy를 사용하여 JIT 컴파일을 통해 프로그램의 실행 속도를 더욱 향상시키세요.

요약:

  1. cProfile로 코드를 프로파일링하여 성능 병목 현상을 이해하세요.
  2. 내장 기능, 메모이제이션 등 Python 최적화 기술을 적용합니다.
  3. PyPy에서 최적화된 코드를 실행하여 더 나은 성능을 얻으세요.

이 접근 방식을 사용하면 특히 CPU 바인딩 작업의 경우 Python 프로그램을 더 빠르고 효율적으로 실행할 수 있습니다.

나와 연결:
Github
링크드인

릴리스 선언문 이 기사는 https://dev.to/usooldatascience/optimizing-python-code-using-cprofile-and-pypy-module-a-complete-guide-4779?1에서 복제됩니다.1 침해가 있는 경우, Study_golang에 문의하세요. @163.com 삭제
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3