33차시. Modular RAG 최적화
퀴즈 1 — 노드별 시간 비중 계산하기
(노드 이름, 걸린 초) 기록 목록을 받아 노드별 호출 수, 총시간, 비중(%)을 계산하세요. 총시간이 큰 노드부터 돌려주세요.
빈칸 코드에서 시작합니다.
def profile(records):
pass결과 보기 (예시 풀이)
# records: (노드 이름, 걸린 시간 초) 기록 목록
# 노드별 호출 수, 총시간, 비중(%)을 계산해 총시간이 큰 순서로 돌려줍니다.
def profile(records):
times = {}
calls = {}
# 같은 노드의 시간과 호출 수를 모읍니다.
for node, sec in records:
times[node] = times.get(node, 0.0) + sec
calls[node] = calls.get(node, 0) + 1
total = sum(times.values())
rows = []
for node in times:
# 비중 = 이 노드의 총시간 / 전체 시간 * 100
share = times[node] / total * 100 if total else 0.0
rows.append((node, calls[node], round(times[node], 1), round(share)))
# 총시간이 큰 노드가 위로 오게 정렬합니다. 이것이 병목 후보 순서입니다.
def sort_key(row):
return -row[2]
rows.sort(key=sort_key)
return rows
# 질문 두 개를 돌렸다고 치고 만든 가짜 기록입니다.
records = [
("classify", 0.4), ("retrieve", 0.1), ("generate", 1.9), ("verify", 1.0),
("classify", 0.3), ("retrieve", 0.1), ("generate", 2.1), ("verify", 1.1),
("generate", 1.8), ("verify", 0.9), # 두 번째 질문에서 재생성이 한 번 일어남
]
# 1) 표 모양으로 출력해 병목이 맨 위에 오는지 봅니다.
for node, n, sec, share in profile(records):
print(f"{node:<10} 호출 {n}회 총 {sec:4.1f}s 비중 {share:>2}%")
# 2) 비중을 모두 더하면 100 근처여야 합니다(반올림 때문에 1 정도 차이 날 수 있음).
print("비중 합:", sum(row[3] for row in profile(records)))
# 3) 기록이 비어 있어도 오류 없이 빈 목록이 나와야 합니다.
print("빈 기록:", profile([]))
실행 결과
generate 호출 3회 총 5.8s 비중 60%
verify 호출 3회 총 3.0s 비중 31%
classify 호출 2회 총 0.7s 비중 7%
retrieve 호출 2회 총 0.2s 비중 2%
비중 합: 100
빈 기록: []채점 기준: 같은 노드의 시간을 합치고, 비중을 전체 시간으로 나눠 구하며, 총시간 내림차순으로 정렬하면 정답이다.