Python PIP의 대항마 UV

Won Joon Kim·2025년 8월 2일

기술조사

목록 보기
4/5
post-thumbnail

1. 개요

Python 패키지 관리자라면 대표적인 pip의 자리를 uv가 위협하고 있다.
uv는 pip와 같은 패키지 관리자이지만 가상환경, 배포, 의존성 관리 모든 것을 할 수 있는 도구 모음집이다.
가장 중요한건 의존성 관리, 패키지 설치 시간이 pip과는 비교도 못할 정도로 빠르다.

2. UV?

간단하게 uv의 장점에 대해서 나열하자면

  • pip보다 10-100배 빠른 속도
  • Python 버전 관리 지원
  • 종합적인 프로젝트 관리 기능
  • 디스크 공간 효율적인 전역 캐시
  • macOS, Linux, Windows 지원

최근 여론에 따르면 속도만 보고도 uv로 넘어갈만한 정도라고 한다.
그래서 직접 uv 환경을 구축해서 패키지 다운로드가 얼마나 빠른지 체감해보았다.

2-1. uv pip install 속도


요약하자면 의존성 해결 0.24초, 패키지 준비 27.05초, 패키지 설치 0.197초가 걸렸다.
저 많은 패키지들 게다가 빅데이터, AI 모델링 관련 패키지들을 30초도 안되는 시간에 설치를 완료했다.
난 솔직히 uv pip install 돌리고 놀라서 박수를 쳤다.

왜 빠를까?

  • Rust로 개발되었다.
    • Python으로 개발된 pip과 달리 C++과 같은 컴파일 언어인 Rust로 개발 되었기 때문에 근본적인 속도 차이가 있다.
  • PubGrub 알고리즘 사용
    • uv는 PubGrub 알고리즘을 사용해서 패키지 간의 의존성 충돌 해결을 1초 안쪽으로 풀어낸다.
    • pip은 백트래킹을 사용했기 때문에 최신 버전부터 시작해서 막히면 다시 돌아가서 다른 버전을 시도하는 방식이였다.
  • 전역 캐시 사용
    • uv는 install이 끝난 모든 패키지를 사용자 로컬 디렉토리의 단일한 전역 캐시에 저장한다. 이후 캐싱된 패키지를 다시 다운로드하는 경우 캐시를 사용해 정말 순식간에 설치를 마친다.

3. 설치

필자는 wsl ubuntu-22.04 환경이기 때문에 Linux 기준으로 작성하겠다.

Linux

curl -LsSf https://astral.sh/uv/install.sh | sh

pip을 이용해서 설치도 가능하지만 pip 대신 쓰는건데 pip으로 깔면 특정 환경에 종속되기 때문에 curl로 까는걸 추천한다.

환경 변수

# .zshrc or .bashrc
export PATH=$HOME/.local/bin:$PATH
export PATH=$PATH:/snap/bin

기존에 conda를 사용했다면 환경 변수에서 conda 파트를 주석하거나 지우는걸 추천한다.

3-1. uv 핵심 기능 정리

자주 사용할 것 같은 기능만 정리하겠다.

Python 설치 및 목록 확인

# 버전은 원하는 버전으로 마음껏!, 여러 버전 한번에도 가능
uv python install 3.11 3.12 ..

# 설치된 파이썬 버전 확인
uv python list

프로젝트 초기화 및 가상환경

# 폴더가 없다면 폴더명으로 폴더가 만들어진다!
# 원하는 파이썬 버전을 기준으로 초기화도 가능하다
uv init <원하는폴더명> <--python 버전>

# 기존에 폴더가 있다면 해당 폴더로 이동한 뒤
cd 원하는/프로젝트/폴더
uv init

프로젝트 초기화를 해도 .venv는 생성되지 않고 아래와 같은 파일들만 생성된다.

# .toml 파일이 이미 있다면 uv init이 안된다.
README.md  __pycache__  main.py  pyproject.toml

가상환경

# 원하는 곳으로 이동해 uv venv 한번이면 .venv 폴더가 생성된다.
cd 원하는/프로젝트/폴더
uv venv

가상환경 활성화

# 가상환경 실행
source .venv/bin/activate

# 굳이 활성화 안하고 스크립트 파일 실행이 가능하다.
uv run script.py  # script.py 실행
uv run -m module  # Python 모듈 실행

# 인자 전달
uv run script.py --arg1 value1 --arg2 value2  # 스크립트에 인자 전달
uv run -m pytest tests/ --verbose  # pytest에 옵션 전달

# 환경 변수 설정
uv run --env VAR1=value1 --env VAR2=value2 script.py  # 환경 변수 설정

# 가상 환경 종료
deactivate

패키지 설치, 의존성 관리

패키지 설치

# 기본 패키지 설치
uv pip install requests  # requests 패키지 설치

# 특정 버전 설치
uv pip install requests==2.31.0  # requests 2.31.0 버전 설치
uv pip install "requests>=2.31.0"  # requests 2.31.0 이상 버전 설치
uv pip install "requests<3.0.0"  # requests 3.0.0 미만 버전 설치

# 패키지 제거
uv pip uninstall requests  # requests 패키지 제거

# 패키지 업그레이드
uv pip install --upgrade requests  # requests 패키지 최신 버전으로 업그레이드
uv pip install --upgrade pip  # pip 자체 업그레이드

uv pip list  # 설치된 모든 패키지 목록 확인

의존성 관리

# add를 해야 해당 프로젝트의 의존성 리스트에 추가가 된다.
uv add requests  # requests 패키지 추가
uv add requests==2.31.0  # 특정 버전의 requests 추가

# 의존성 제거
uv remove requests  # requests 패키지 제거

# 의존성 관리 : add한 것들이 uv.lock에 들어간다.
uv lock  # 현재 의존성 상태를 잠금 파일에 저장
uv pip freeze > requirements.txt # requirements.txt 관리
uv pip install -r requirements.txt

# 의존성 동기화 : uv.lock 기준으로 의존성을 맞춘다.
uv sync  # 모든 의존성 설치/업데이트

시나리오

# 프로젝트 초기화
uv init uvtest --python 3.11
cd uvtest

# 가상환경 생성 : 초기화 할때 설정한 파이썬 버전 기준으로 생성됨
uv venv

# 패키지 설치 + 의존성 추가
uv add \ # 삭제는 remove
    pandas \
    numpy \
    scipy \
    matplotlib \
    seaborn \
    scikit-learn \
    xgboost \
    lightgbm \
    fastapi \
    'uvicorn[standard]' \
    pydantic \
    sqlalchemy \
    alembic \
    psycopg2-binary \
    pyspark \
    great-expectations \
    dbt-core \
    requests \
    beautifulsoup4
    
# 의존성 기록 : requirements.txt 느낌
uv lock

# uv.lock 기준 의존성 동기화
uv sync

4. 정리

기존에 사용하던 pip 명령어와 크게 다를건 없어 보인다.
그래서 러닝커브도 그렇게 크지 않은데 패키지 설치 속도는 10 ~ 100배 빠르고, uv 하나면 가상환경까지 전부 사용할 수 있다.
솔직히 속도만 봐도 넘어갈 정도인데 한방에 모든게 된다는 게 또 호감이다.

profile
데이터 엔지니어

0개의 댓글