Python Data Stack 2.0: Pandas와 Pip의 종말? (가이드 2025-2026)
Source: Dev.to
Rust(uv, Polars)와 BigQuery 혁명이 데이터 엔지니어링을 어떻게 바꾸었는가.
2025년에 데이터를 다루고 있다면, 기존 도구들이 최신 하드웨어를 따라가지 못한다는 느낌을 받을 것이다. 지난 10년간 사실상의 표준이었던 — Pip으로 설치한 Jupyter Notebook의 Pandas — 은 이제 지속 가능하지 않다. 우리는 로컬 Spark 시대에서 네이티브 성능(Rust) 및 클라우드 서버리스 시대로 전환하고 있다.
이 가이드는 (특히 macOS/Apple Silicon 사용자) 엔지니어와 데이터 과학자를 위한 기술 선언문으로, 메모리와 성능 병목 현상에서 벗어나고자 하는 이들을 위한 것이다.
레거시 스택에서 모던 스택으로 마이그레이션
| 카테고리 | 구버전 표준 (2020) | 새 스택 (2025/26) | 실제 이득 |
|---|---|---|---|
| 패키지 관리자 | pip / virtualenv / conda | uv (Astral) – 설치 속도가 10‑100배 빠르고, 전역 캐시 및 결정론적 충돌 해결 | |
| 로컬 처리 | pandas (single‑threaded) | polars (Rust‑based) – 지연 실행, 네이티브 멀티스레딩 (M3/M4 모든 코어 사용) 및 효율적인 메모리 | |
| 로컬 SQL 엔진 | sqlite / csv | duckdb – Parquet/Iceberg 파일에서 벡터화 성능을 갖는 로컬 OLAP | |
| 빅데이터 / 클라우드 | pyspark ou SQL strings | bigframes (BigQuery) – Pandas 구문을 사용해 페타바이트 규모를 처리, 데이터를 로컬로 다운로드하지 않음 | |
| 노트북 | Jupyter clássico | marimo – 반응형 노트북, 깨끗한 .py 파일로 저장 (Git‑friendly), 숨겨진 상태 없음 | |
| 하드웨어 | Intel x86 | Apple Silicon (ARM64) – 통합 메모리 (CPU+GPU) 접근 가능, 데이터 복사 없이 |
uv를 사용한 의존성 관리
Python 의존성 관리는 언제나 악몽(“dependency hell”)이었습니다. Rust로 작성된 uv는 pip, pip‑tools, pipx, poetry, virtualenv를 한 번에 대체합니다.
기존 워크플로우
python -m venv venv
source venv/bin/activate
pip install pandas numpy # 기다림이 끝이 없어요...
pip freeze > requirements.txt
최신 워크플로우 (uv)
# venv를 생성하고 밀리초 단위로 설치
uv venv
uv add polars duckdb
# 수동으로 활성화할 필요 없이 격리된 스크립트를 실행
uv run analise.py
프로 팁
uv를 사용하면 헤더에 자체 의존성을 선언하는 독립 실행형 스크립트를 만들 수 있습니다. uv는 모든 것을 임시 환경에 다운로드하고 실행한 뒤 정리합니다.
Pandas vs. Polars
Pandas와 Polars의 차이는 아키텍처에 있습니다. Pandas는 NumPy 위에 구축되었으며 (문자열이나 null을 잘 처리하지 못함) 모든 작업을 즉시 실행(eager)하여 RAM에 거대한 복사본을 만들게 됩니다.
Pandas – RAM 무거움 (전형적인 예시)
import pandas as pd
# Lê 10 GB para a RAM (perigo de OOM!)
df = pd.read_csv("vendas_large.csv")
# Cria cópias intermediárias na memória
df_filtrado = df[df['regiao'] == 'Sudeste']
resultado = df_filtrado.groupby('categoria')['total'].sum()
Polars – Lazy & Streaming
import polars as pl
# scan_csv não carrega nada ainda (lazy)
query = (
pl.scan_csv("vendas_large.csv")
.filter(pl.col("regiao") == "Sudeste") # predicate pushdown: filtra no disco
.group_by("categoria")
.agg(pl.col("total").sum())
)
# Executa usando streaming (processa datasets maiores que a RAM)
resultado = query.collect(streaming=True)
Polars의 주요 장점
- Lazy Execution – 필요한 열/행만 읽습니다.
- Multithreading – 칩의 모든 코어를 사용합니다 (M3/M4/M5).
- Zero‑Copy – Apache Arrow와 완벽하게 통합됩니다.
빅 데이터 / 클라우드와 bigframes (BigQuery)
데이터가 Mac에서 처리하기에 너무 클 때는 이전에 Spark를 사용하려면 Java/Scala를 배우거나 거대한 SQL 문자열을 작성해야 했습니다. 오늘날 BigQuery DataFrames는 Google의 서버리스 클러스터에서 처리되는 동안 Pandas 문법을 사용할 수 있게 해줍니다.
import bigframes.pandas as bpd
# Conecta a uma tabela de 10 TB (só baixa metadados)
df = bpd.read_gbq("meu-projeto.logs.acessos_2025")
# Parece Pandas, mas roda na nuvem do Google
df_erro = df[df['status_code'] >= 500] # predicate pushdown automático
# Agregação remota
contagem = df_erro.groupby('hora')['id'].count()
# O resultado só é baixado aqui (e é minúsculo)
print(contagem)
Marimo vs. Jupyter
Jupyter에는 치명적인 문제가 있습니다: 숨겨진 상태. 셀을 순서대로 실행하지 않으면 결과가 달라질 수 있고, .ipynb (JSON) 파일은 버전 관리가 어렵습니다.
왜 Marimo를 선택해야 할까요?
- 반응형 – 변수를 바꾸면 의존하는 모든 셀이 자동으로 업데이트됩니다 (Excel처럼).
- 순수 Python – 노트북이
.py파일로 저장됩니다. - Git‑친화적 – 깔끔하고 읽기 쉬운 diff를 제공합니다.
결론
“Modern Data Stack”이 2026년 macOS에서 의미하는 것은 유행을 따르는 것이 아니라 자원 효율성입니다:
- 컴퓨팅 – Rust로 Apple Silicon을 100 % 활용합니다.
- 메모리 – Arrow와 Polars를 이용한 제로‑카피.
- 시간 – uv로 즉시 설치합니다.
Pandas와 Pip를 포기하는 것이 처음엔 두려울 수 있지만, 로컬 노트북에서 수십억 행을 처리할 때 얻는 생산성 향상은 비교할 수 없습니다.
다음 행동: 오늘 uv를 설치하고 다시는 뒤돌아보지 마세요.
curl -LsSf https://astral.sh/uv/install.sh | sh