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 합계