Python 개발자로서 우리는 코드 최적화에 대해 걱정하기 전에 코드를 작동시키는 데 집중하는 경우가 많습니다. 그러나 대규모 애플리케이션이나 성능이 중요한 코드를 처리할 때는 최적화가 중요합니다. 이 게시물에서는 Python 코드를 최적화하는 데 사용할 수 있는 두 가지 강력한 도구인 cProfile 모듈과 PyPy 인터프리터에 대해 설명합니다.
이 게시물이 끝날 때쯤에는 다음 내용을 배우게 됩니다.
Python은 사용 용이성, 가독성, 방대한 라이브러리 생태계로 잘 알려져 있습니다. 그러나 해석된 특성으로 인해 C나 Java와 같은 다른 언어보다 속도도 느립니다. 따라서 Python 코드를 최적화하는 방법을 아는 것은 기계 학습 모델, 실시간 시스템 또는 고빈도 거래 시스템과 같이 성능에 민감한 애플리케이션에서 매우 중요할 수 있습니다.
최적화는 일반적으로 다음 단계를 따릅니다.
이제 코드 프로파일링부터 시작해 보겠습니다.
cProfile은 성능 프로파일링을 위해 내장된 Python 모듈입니다. 코드의 각 기능을 실행하는 데 걸리는 시간을 추적하여 속도 저하를 일으키는 기능이나 코드 섹션을 식별하는 데 도움이 될 수 있습니다.
스크립트를 프로파일링하는 가장 간단한 방법은 명령줄에서 cProfile을 실행하는 것입니다. 예를 들어 my_script.py라는 스크립트가 있다고 가정해 보겠습니다.
python -m cProfile -s cumulative my_script.py
설명:
이렇게 하면 코드가 어디에 시간을 소비하는지에 대한 자세한 분석이 생성됩니다.
피보나치 수를 재귀적으로 계산하는 기본 Python 스크립트를 살펴보겠습니다.
def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2) if __name__ == "__main__": print(fibonacci(30))
cProfile을 사용하여 이 스크립트 실행:
python -m cProfile -s cumulative fibonacci_script.py
cProfile을 실행하면 다음과 같은 내용이 표시됩니다.
ncalls tottime percall cumtime percall filename:lineno(function) 8320 0.050 0.000 0.124 0.000 fibonacci_script.py:3(fibonacci)
각 열은 주요 성과 데이터를 제공합니다.
피보나치 함수에 시간이 너무 많이 걸리는 경우 이 출력을 통해 최적화 노력을 어디에 집중해야 할지 알 수 있습니다.
특정 섹션만 프로파일링하려는 경우 코드 내에서 프로그래밍 방식으로 cProfile을 사용할 수도 있습니다.
import cProfile def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2) if __name__ == "__main__": cProfile.run('fibonacci(30)')
cProfile을 사용하여 코드의 병목 현상을 식별한 후에는 최적화할 시간입니다.
예:
# Before: Custom sum loop total = 0 for i in range(1000000): total += i # After: Using built-in sum total = sum(range(1000000))
예:
# 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)
예:
from functools import lru_cache @lru_cache(maxsize=None) def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2)
각 재귀 호출의 결과를 저장하여 피보나치 계산 속도를 크게 높입니다.
PyPy는 JIT(Just-in-Time) 컴파일을 사용하여 Python 코드를 가속화하는 대체 Python 인터프리터입니다. PyPy는 자주 실행되는 코드 경로를 기계어 코드로 컴파일하여 특정 작업에 대한 표준 CPython 인터프리터보다 훨씬 빠릅니다.
You can install PyPy using a package manager like apt on Linux or brew on macOS:
# On Ubuntu sudo apt-get install pypy3 # On macOS (using Homebrew) brew install pypy3
Once PyPy is installed, you can run your script with it instead of CPython:
pypy3 my_script.py
Now, let’s combine these tools to fully optimize your Python code.
Let’s revisit our Fibonacci example and put everything together.
from functools import lru_cache @lru_cache(maxsize=None) def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2) if __name__ == "__main__": import cProfile cProfile.run('print(fibonacci(30))')
After optimizing the code with memoization, run it using PyPy for further performance improvements:
pypy3 fibonacci_script.py
By leveraging cProfile and PyPy, you can greatly optimize your Python code. Use cProfile to identify and address performance bottlenecks in your code. Then, use PyPy to further boost your program’s execution speed through JIT compilation.
In summary:
With this approach, you can make your Python programs run faster and more efficiently, especially for CPU-bound tasks.
Connect with me:
Github
Linkedin
위 내용은 cProfile 및 PyPy 모듈을 사용하여 Python 코드 최적화: 전체 가이드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!