Programming Languages/Python

함수의 효율성과 성능 최적화

newclass 2025. 3. 26. 03:32

함수의 효율성과 성능 최적화

함수를 작성할 때 성능과 효율성을 고려하는 것이 중요합니다.

재귀 함수와 메모이제이션(Memoization)

재귀 함수는 직관적이지만 중복 계산으로 인해 비효율적일 수 있습니다. 메모이제이션을 통해 이를 개선할 수 있습니다.

# 일반적인 피보나치 재귀 함수 (비효율적)
def 피보나치_일반(n):
    if n <= 1:
        return n
    return 피보나치_일반(n-1) + 피보나치_일반(n-2)

# 메모이제이션을 적용한 피보나치 함수
def 피보나치_메모이제이션(n, 메모={}):
    # 이미 계산한 값이 있으면 재사용
    if n in 메모:
        return 메모[n]
    
    # 기본 케이스
    if n <= 1:
        return n
    
    # 결과 계산 및 저장
    메모[n] = 피보나치_메모이제이션(n-1, 메모) + 피보나치_메모이제이션(n-2, 메모)
    return 메모[n]

# 성능 비교
import time

# 일반 재귀 함수 시간 측정
시작_시간 = time.time()
피보나치_일반(30)
일반_시간 = time.time() - 시작_시간
print(f"일반 재귀 함수 실행 시간: {일반_시간:.6f}초")

# 메모이제이션 함수 시간 측정
시작_시간 = time.time()
피보나치_메모이제이션(30)
메모_시간 = time.time() - 시작_시간
print(f"메모이제이션 함수 실행 시간: {메모_시간:.6f}초")
print(f"성능 향상: {일반_시간/메모_시간:.1f}배")

함수 최적화 팁

불필요한 계산 피하기

# 비효율적인 방법
def 제곱합_비효율(n):
    합계 = 0
    for i in range(1, n+1):
        합계 += i ** 2
    return 합계

# 수학적 공식을 활용한 효율적인 방법
def 제곱합_효율(n):
    return n * (n + 1) * (2 * n + 1) // 6

적절한 자료구조 사용하기

# 리스트를 사용한 검색 (O(n) 시간 복잡도)
def 리스트_검색(리스트, 찾는값):
    for 값 in 리스트:
        if 값 == 찾는값:
            return True
    return False

# 집합을 사용한 검색 (O(1) 시간 복잡도)
def 집합_검색(집합, 찾는값):
    return 찾는값 in 집합

반복문 최적화하기

# 불필요한 연산이 있는 반복문
def 합계_비효율(리스트):
    합계 = 0
    길이 = len(리스트)  # 매 반복마다 계산
    for i in range(길이):
        합계 += 리스트[i]
    return 합계

# 최적화된 반복문
def 합계_효율(리스트):
    합계 = 0
    길이 = len(리스트)  # 한 번만 계산
    for i in range(길이):
        합계 += 리스트[i]
    return 합계