RyanNerd
라덕'Story
RyanNerd
  • 분류 전체보기 (117)
    • Study Note (80)
      • Python (3)
      • R (1)
      • Airflow (7)
      • 통계 (26)
      • Machine Learning (16)
      • Streamlit (9)
      • Django (1)
      • Deep Learning (12)
      • dbt (2)
      • SQL (3)
    • 빅데이터분석기사 (1)
      • 필기 (1)
    • Programmers (28)
      • Python (13)
      • SQL (15)
    • Project (3)
      • Django (3)
    • Mac (2)

블로그 메뉴

  • NaverBlog
  • 홈

최근 글

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
RyanNerd

라덕'Story

Study Note/Streamlit

속도는 올리고 코드는 깔끔하게

2025. 12. 29. 13:49

앱이 커지면 코드가 복잡해지고 속도가 느려집니다.  기능 분리(Code Structure)와 캐싱(Caching)으로 성능을 최적화하는 방법을 알아봅시다.

 

1. 코드 구조화: common.py 분리하기

데이터를 로드하거나 전처리하는 무거운 함수들은 별도 파일(common.py)로 빼두는 것이 좋습니다. 그래야 메인 코드(app.py)가 깔끔해집니다.

 

파일 구조

  • common.py: 데이터 생성 및 로드 담당
  • app.py: 화면 구성 및 시각화 담당

 

2. 실행 속도 높이기: @st.cache_data

Streamlit은 버튼을 한 번 클릭할 때마다 코드를 처음부터 끝까지 다시 실행하는 특징이 있습니다. 데이터가 100만 건이라면 매번 다시 로딩하느라 엄청 느려지겠죠? 이때 "이 데이터는 변하지 않으니 기억해둬!"라고 명령하는 것이 바로 캐싱(Caching)입니다.

[Code] 최적화된 코드 예시

common.py (데이터 로드 전용)

import streamlit as st
import pandas as pd
import numpy as np

# @st.cache_data 데코레이터 추가! -> 이것이 속도 향상의 핵심
@st.cache_data
def get_medical_data():
    # 데이터 생성에 5초가 걸린다고 가정하면, 
    # 첫 실행 때만 5초 걸리고, 두 번째부터는 0.001초 만에 불러옵니다!
    print("데이터를 새로 생성합니다...") # 실행 확인용 로그
    
    np.random.seed(42)
    n = 1000 # 데이터가 커져도 캐싱 덕분에 빠름
    df = pd.DataFrame({
        'Patient_ID': range(1, n+1),
        'Age': np.random.randint(30, 80, n),
        'BMI': np.random.normal(25, 4, n).round(1),
        'Blood_Pressure': np.random.randint(90, 160, n),
        'Risk_Group': np.random.choice(['Low', 'Medium', 'High'], n)
    })
    return df

 

app.py (메인 화면)

import streamlit as st
from common import get_medical_data # 분리한 파일에서 함수 불러오기

st.title("고속 의료 데이터 분석기")

# 캐싱된 함수 호출
# 버튼을 아무리 눌러도 '데이터를 새로 생성합니다...' 로그가 뜨지 않습니다.
df = get_medical_data() 

st.success("데이터 로드 완료! (캐싱 적용됨)")
st.write(f"총 환자 수: {len(df)}명")

# 이후 시각화 로직...

Tip:

  • 모듈화 (common.py): 데이터 로딩 로직을 분리하면, 나중에 다른 분석 앱을 만들 때도 from common import get_medical_data만 하면 되니 재사용성이 높아집니다.
  • 캐싱 (@st.cache_data): 의료 데이터는 용량이 큰 경우가 많습니다. 이 기능을 안 쓰면 필터 하나 바꿀 때마다 로딩을 기다려야 합니다. 꼭 사용하세요!

'Study Note > Streamlit' 카테고리의 다른 글

AI 모델, 직접 만들어서 웹으로 배포하기 (A to Z)  (1) 2025.12.29
"내 앱은 왜 자꾸 까먹을까?" : Session State와 Caching 완벽 해부  (0) 2025.12.29
의료 데이터 분석, 웹으로 띄우기 (기초편)  (0) 2025.12.29
머신러닝 모델 연동: "재입원 확률, AI에게 물어보세요"  (0) 2025.12.29
EDA 대시보드: 가상의 의료 데이터 생성 및 시각화  (0) 2025.12.29
    'Study Note/Streamlit' 카테고리의 다른 글
    • AI 모델, 직접 만들어서 웹으로 배포하기 (A to Z)
    • "내 앱은 왜 자꾸 까먹을까?" : Session State와 Caching 완벽 해부
    • 의료 데이터 분석, 웹으로 띄우기 (기초편)
    • 머신러닝 모델 연동: "재입원 확률, AI에게 물어보세요"
    RyanNerd
    RyanNerd
    라이언 덕후의 일상 스토리~

    티스토리툴바