νμ΄μ¬
κ°μΈμ μΌλ‘ νμ΄μ¬μ μ’μνμ§ μλλ€. κ·Έλ¬λ, AI μλμ μμ΄ νμ΄μ¬μ μΈμ κΉμ§λ κΈ°νΌν μ μλ€. λΉλ‘ νμ΄μ¬μΌλ‘ κ°λ°νμ§ μλλΌλ νμ΄μ¬ μ½λλ₯Ό λ³΄κ³ μ΄ν΄ν μ μλ μλμ ν€μ보μ. νμ΄μ¬μ κ°λ°μ 보λ€λ DevOps μμ§λμ΄ λλ QA μμ§λμ΄ κ·Έλ¦¬κ³ λ°μ΄ν° λΆμ μμ§λμ΄κ° λ§μ΄ νμ©νλ€.
νμ΄μ¬ μΈν°ν리ν°
νμ΄μ¬μ μ»΄νμΌ λ¨κ³λ₯Ό κ±°μΉμ§ μκ³ μ½λλ₯Ό νμ€μ© κ·Έλλ‘ νμ΄μ¬ μΈν°ν리ν°μ μν΄ μ½λκ° μ€νλλ€. κΈ°λ³Έμ μΈ νμ΄μ¬ μΈν°ν리ν°λ CPython μ΄λ©°, pip λλ uv λ νμ΄μ¬μμ μ¬μ©ν μ μλ ν¨ν€μ§ λ§€λμ μ΄λ€. νμ΄μ¬ κ°λ°μκ° μλκΈ° λλ¬Έμ νμ΄μ¬ μΈν°ν리ν°κ° μ νν μ΄λ€ κ³Όμ μΌλ‘ μ½λλ₯Ό μ€ννλμ§λ μμΈν μ νμλ μμ΄λ³΄μΈλ€.
λͺ¨λ λλ ν 리
νμ΄μ¬μ λ³μ λλ ν¨μ κ·Έλ¦¬κ³ ν΄λμ€ λ±μ νλμ .py νμΌμ μ μνμ¬ λ€λ₯Έ νμΌμμ λΆλ¬μ¬ μ μλλ‘ λͺ¨λννλ€. μΉ μ ν리μΌμ΄μ
μμ±μ μν΄ FastAPI ν¨ν€μ§λ₯Ό μ€μΉνλ©΄ λͺ¨λμ κ°μ Έμμ μ€ννκ² λλ€. λͺ¨λ νμΌμ΄ μ‘΄μ¬νλ λλ ν 리μ __init__.py
νμΌμ΄ μ‘΄μ¬νλ©΄ ν΄λΉ ν΄λλ ν¨ν€μ§λ‘ μ·¨κΈλλ€. Best Practices νλ‘μ νΈ μ½λλ₯Ό μ°Ύμ보면 νμΌ κ΅¬μ‘° μμ μ΄ νμΌμ΄ μμ μ μλ κ±Έ λ³Ό μ μλλ° μλ΅μ΄ κ°λ₯ν κ²μΌλ‘ 보μΈλ€.
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def index():
return {"Hello": "World"}
λ°μ½λ μ΄ν°
νμ΄μ¬μμ λ°μ½λ μ΄ν°λ λ€λ₯Έ ν¨μλ₯Ό λννλ ν¨ν΄μ΄λ€. FastAPIμμ λΌμ°ν°λ₯Ό λ±λ‘ν λ μ¬μ©νκ±°λ Cacheλ₯Ό ν΅ν΄ νμ΄μ¬ μ±λ₯μ ν₯μμν€λλ° μ¬μ©ν μ μλ€. λ€μκ³Ό κ°μ νμ΄λ° λ°μ½λ μ΄ν°λ ν¨μμ μ€ν μκ°μ μΈ‘μ νμ¬ μ±λ₯ μ΄μκ° λ΄μ¬λ ꡬκ°μ μ°Ύλλ° λμμ΄ λλ€.
import functools
import time
def timing_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"ν¨μ '{func.__name__}' μ€ν μκ°: {end_time - start_time:.4f} μ΄")
return result
return wrapper
@timing_decorator
def example_function(n):
total = 0
for i in range(n):
total += i
return total
if __name__ == '__main__':
example_function(10000000)
SQLAlchemy vs SQLModel
SQLAlchemy ORMμ νμ΄μ¬μμ μ¬μ©ν μ μλ ORM λΌμ΄λΈλ¬λ¦¬λ‘ SQLite μ κ°μ λ°μ΄ν°λ² μ΄μ€μ ν΅μ ν μ μλ€ . FastAPI μμ μ 곡νλ SQLModel μ SQLAlchemy κΈ°λ°μμ Pydantic μ΄ κ²°ν©λ κΈ°λ₯μ μ§μνλ€. SQLModel μ μ λλ‘ μ¬μ©νκΈ° μν΄μλ SQLAlchemy λ₯Ό λ¨Όμ νμ΅νλ κ²μ΄ μ’μ κ² κ°λ€. λ€μμ AWS IoT Core μμ λ°κΈλ°μ IoT ν΄λΌμ΄μΈνΈ μΈμ¦μλ₯Ό μ μ₯ν μ μλ ν μ΄λΈμ μ μν΄λ³Έ κ²μ΄λ€.
from datetime import datetime
from sqlmodel import Field, Session, SQLModel, create_engine, Column, LargeBinary
from sqlalchemy.dialects.sqlite import insert
class IoT(SQLModel, table=True):
__tablename__ = "iot"
__table_args__ = {"sqlite_autoincrement": True, "comment": "AWS IoT Thing"}
id: int = Field(default=None, primary_key=True)
client_id: str = Field(nullable=False, unique=True)
private_key: bytes = Field(sa_column=Column(LargeBinary, nullable=False))
cert_pem: bytes = Field(sa_column=Column(LargeBinary, nullable=False))
ca_cert_pem: bytes | None = Field(sa_column=Column(LargeBinary, nullable=True))
created_at: datetime = Field(default_factory=lambda: datetime.now(), nullable=False)
engine = create_engine(
"sqlite:///./db/app.db", echo=True, pool_size=5, pool_recycle=3600
)
SQLModel.metadata.create_all(engine)
session = Session(engine)
stmt = (
insert(IoT)
.values(client_id="asdf", private_key=b"", cert_pem=b"")
.on_conflict_do_nothing()
)
session.exec(stmt)
session.commit()
Pandas vs Polars
νμ΄μ¬ νλ‘μ νΈμμ λ°μ΄ν° μ²λ¦¬ λ° λΆμμ μν΄ λ°μ΄ν° νλ μμ λ€λ£¨λ λΌμ΄λΈλ¬λ¦¬λ‘ μ ν΅μ μΌλ‘ νλ€μ€κ° μ¬μ©λμμ§λ§ μ΅κ·Όμλ νλ€μ€μ λ¨μ μΈ μ±λ₯ μ΄μλ₯Ό 보μνκΈ° μν΄ Rustλ‘ μμ±λ ν΄λΌμ€λ‘ λ체λμ΄ μ¬μ©λλ κ² κ°λ€. μ ―λΈλ μΈμ€ λΈλ‘κ·Έμμ 곡μ ν Polarsμ pandas λΉκ΅: μ΄λ»κ² λ€λ₯ΌκΉμ?λ₯Ό μ½μ΄λ³΄μ.
Seaborn vs Plotly
λ°μ΄ν° λΆμμμ μ°¨νΈ μκ°νλ Matplotlib, Seaborn, Plotly μ€ νλλ₯Ό μ¬μ©νλ κ² κ°λ€. λ€μκ³Ό κ°μ΄ Polars DataFrame μ Visualizationν μ μλ€.
import polars as pl
import plotly.express as px
if __name__ == "__main__":
df = pl.DataFrame({"category": ["A", "B", "C", "D"], "value": [10, 25, 15, 30]})
fig = px.bar(
df, x="category", y="value", title="Polars DataFrame with Plotly Express"
)
fig.show()