오늘은 어떻게 짜야 체게적인가(구조)를 배워보려고 한다.
오늘의 핵심 키워드는 Class이다.
함수가 '특정 기능을 하는 부품'이라면, 클래스는 '그 부품들을 모아놓은 기계'이다.
어제 만든 성능 테스트 함수들을 모아 PerformanceTester라는 이름의 기계를 만들어 보자.
import time
import numpy as np
class PerformanceTester:
def __init__(self, n_samples: int):
self.update_data(n_samples) # 중복 피하기 위해 update_data를 호출
def update_data(self, new_n: int):
"""데이터를 새로 생성하는 메서드"""
self.n_samples = new_n
self.data = list(range(new_n))
self.data_np = np.array(self.data)
print(f"\n[알림] 데이터가 {new_n}개로 준비되었습니다.")
def test_for_loop(self):
start = time.time()
result = []
for x in self.data:
result.append(x * 2 if x % 2 == 0 else x + 1)
return time.time() - start
def test_comprehension(self):
start = time.time()
result = [x * 2 if x % 2 == 0 else x + 1 for x in self.data]
return time.time() - start
def test_numpy(self):
start = time.time()
# NumPy의 벡터화 연산
result = np.where(self.data_np % 2 == 0, self.data_np * 2, self.data_np + 1)
return time.time() - start
def run_all(self):
t1 = self.test_for_loop()
t2 = self.test_comprehension()
t3 = self.test_numpy()
speedup = t1 / t3
print(f"For-loop: {t1:.4f}s")
print(f"Comprehension: {t2:.4f}s")
print(f"Numpy: {t3:.4f}s")
print(f"Numpy is {speedup:.1f}x faster than For-loop")
# --- 실행부 ---
tester = PerformanceTester(1000000)
tester.run_all()
# 데이터 개수를 5배 늘려서 다시 테스트
tester.update_data(5000000)
tester.run_all()

1.캡슐화: 데이터와 기능을 하나로
2.재사용성: update_data만 호출하면 똑같은 테스트를 다른 데이터로 무한 반복
3.코드의 확장성: 클래스 안에 메서드 하나만 더 만들면 된다.