본문 바로가기
Python 문법/Python 기본 문법(3.10 기준)

[python3.10 기본] 25. 성능 최적화

by cogito21_python 2024. 7. 2.
반응형

25.1 프로파일링 (cProfile, timeit 모듈)

프로파일링은 프로그램의 성능 병목 지점을 식별하는 데 사용됩니다. 파이썬에서는 cProfiletimeit 모듈을 사용하여 프로파일링을 수행할 수 있습니다.

cProfile 모듈

기본 사용법

import cProfile

def slow_function():
    total = 0
    for i in range(1, 10000):
        for j in range(1, 100):
            total += i * j
    return total

cProfile.run('slow_function()')

프로파일링 결과 저장

import cProfile

def slow_function():
    total = 0
    for i in range(1, 10000):
        for j in range(1, 100):
            total += i * j
    return total

profiler = cProfile.Profile()
profiler.enable()
slow_function()
profiler.disable()
profiler.dump_stats('profile_data.prof')

프로파일링 결과 분석

import pstats

p = pstats.Stats('profile_data.prof')
p.sort_stats('cumulative').print_stats(10)

timeit 모듈

timeit 모듈은 코드의 실행 시간을 측정하는 데 사용됩니다.

기본 사용법

import timeit

def slow_function():
    total = 0
    for i in range(1, 10000):
        for j in range(1, 100):
            total += i * j
    return total

execution_time = timeit.timeit(slow_function, number=1)
print(f'Execution time: {execution_time}')

25.2 메모리 관리 기법

파이썬에서 메모리 사용을 최적화하는 방법은 여러 가지가 있습니다.

객체 참조 제거
더 이상 필요하지 않은 객체에 대한 참조를 제거하여 메모리 누수를 방지합니다.

a = [1, 2, 3, 4, 5]
del a  # a에 대한 참조 제거

제너레이터 사용
대량의 데이터를 처리할 때 메모리를 절약하기 위해 제너레이터를 사용합니다.

def generate_numbers(n):
    for i in range(n):
        yield i

for number in generate_numbers(1000000):
    print(number)

메모리 프로파일링
memory_profiler 모듈을 사용하여 메모리 사용을 프로파일링합니다.

pip install memory_profiler
from memory_profiler import profile

@profile
def slow_function():
    total = 0
    for i in range(1, 10000):
        for j in range(1, 100):
            total += i * j
    return total

slow_function()

25.3 Cython을 사용한 성능 개선

Cython은 파이썬 코드를 C로 컴파일하여 성능을 개선할 수 있는 도구입니다.

Cython 설치

pip install cython

기본 사용법

example.pyx 파일 생성

def slow_function():
    total = 0
    for i in range(1, 10000):
        for j in range(1, 100):
            total += i * j
    return total

setup.py 파일 생성

from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("example.pyx"),
)

Cython 모듈 컴파일

python setup.py build_ext --inplace

사용 예

import example

result = example.slow_function()
print(result)

25.4 JIT 컴파일러 (PyPy)

PyPy는 Just-In-Time(JIT) 컴파일러를 사용하여 파이썬 코드를 더 빠르게 실행할 수 있는 대체 인터프리터입니다.

PyPy 설치
PyPy는 공식 웹사이트(https://www.pypy.org/)에서 다운로드할 수 있습니다.

PyPy 사용
PyPy를 사용하여 파이썬 스크립트를 실행하면 JIT 컴파일을 통해 성능이 개선됩니다.

pypy my_script.py

예제

다음은 위에서 설명한 성능 최적화 기법을 사용한 예제입니다.

프로파일링 예제

import cProfile

def slow_function():
    total = 0
    for i in range(1, 10000):
        for j in range(1, 100):
            total += i * j
    return total

cProfile.run('slow_function()')

메모리 관리 예제

from memory_profiler import profile

@profile
def slow_function():
    total = 0
    for i in range(1, 10000):
        for j in range(1, 100):
            total += i * j
    return total

slow_function()

Cython 예제

example.pyx

def slow_function():
    total = 0
    for i in range(1, 10000):
        for j in range(1, 100):
            total += i * j
    return total

setup.py

from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("example.pyx"),
)

컴파일 및 실행

python setup.py build_ext --inplace
python -c "import example; print(example.slow_function())"

 

반응형