귀하는 로그인되어 있지 않습니다. 이대로 편집하면 귀하의 IP 주소가 편집 기록에 남게 됩니다.스팸 방지 검사입니다. 이것을 입력하지 마세요!== 속도의 비밀 == uv가 pip보다 10~100배 빠른 이유는 단순히 Rust로 만들어졌기 때문만이 아니다. 여러 영리한 엔지니어링 결정들이 복합적으로 작용한 결과다. === Rust 기반의 구현 === pip은 [[파이썬]]으로 작성되어 있다. 파이썬은 고수준 언어로 편리하지만, 파일 I/O나 복잡한 연산에서 오버헤드가 크다. 특히 파이썬의 '''GIL(Global Interpreter Lock)''' 때문에 진정한 멀티스레드 병렬 처리가 불가능하다. 반면 uv는 [[Rust]]로 작성되어 있다. Rust는: * GIL 없이 네이티브 멀티스레드 지원 * 가비지 컬렉터 없는 메모리 관리로 런타임 오버헤드 최소화 * 단일 정적 바이너리 배포 → 인터프리터 시작 비용 없음 * `rkyv` 라이브러리를 이용한 제로카피 역직렬화 === PubGrub 의존성 해결 알고리즘 === pip의 기존 의존성 해결 알고리즘은 버전을 하나씩 시도하고 실패하면 되돌아가는 단순한 백트래킹 방식이었다. 복잡한 의존성 트리에서 수분이 걸리기도 했다. uv는 '''PubGrub''' 알고리즘을 사용한다. PubGrub은 원래 Dart의 pub 패키지 매니저에서 개발된 알고리즘으로, SAT 솔버의 '''CDCL(Conflict-Driven Clause Learning)''' 기법을 적용했다. 작동 방식을 쉽게 설명하면: # 의존성 요구사항들을 논리 제약 조건으로 모델링한다 # 충돌이 발생하면 단순히 되돌아가는 게 아니라 '''왜 충돌이 발생했는지 학습'''한다 # 이 학습된 정보를 바탕으로 비슷한 실패 조합을 수백만 가지씩 한번에 건너뛴다 덕분에 복잡한 의존성 그래프에서도 매우 빠르게 해결책을 찾고, 실패 시에도 '''명확한 에러 메시지'''를 제공한다. > 예: `"Failed to resolve: package-a requires requests<=2.28 but package-b requires requests>=2.29"` === 글로벌 캐시 + 하드링크 === pip은 패키지를 설치할 때마다 각 가상환경의 `site-packages` 폴더에 파일을 '''복사'''한다. 10개의 프로젝트에서 numpy를 쓴다면 numpy 파일이 10벌 복사된다. 낭비다. uv는 다르다: # 패키지를 처음 다운로드하면 '''글로벌 캐시''' (`~/.cache/uv/wheels/`)에 저장한다 # 이후 설치할 때는 파일을 복사하는 대신 '''하드링크(hardlink)''' 또는 '''Copy-on-Write(CoW)'''를 사용해 가상환경이 캐시를 가리키도록 한다 도서관에 비유하면: pip은 책을 빌릴 때마다 복사본을 만드는 방식이고, uv는 도서관에 원본을 두고 위치 표지만 나눠주는 방식이다. 이 덕분에: * '''워크캐시 상태에서 가상환경 생성이 밀리초 수준'''으로 빠르다 * 동일 패키지를 여러 프로젝트에서 써도 디스크 공간을 낭비하지 않는다 === 병렬 다운로드 및 설치 === pip은 패키지를 순차적으로 다운로드하고 설치하는 경향이 있다. uv는 Rust의 멀티스레드를 활용해 패키지들을 '''동시에''' 다운로드하고 설치한다. 여러 개의 무거운 패키지 (예: torch + numpy + pandas)를 한번에 추가할 때 차이가 확연히 드러난다. === HTTP Range Request로 메타데이터만 가져오기 === pip은 패키지의 메타데이터를 얻기 위해 wheel 파일 전체를 다운로드하는 경우가 있다. PyTorch 같은 수 GB짜리 패키지도 마찬가지다. uv는 HTTP의 `Range` 헤더를 사용해 wheel 파일의 앞부분 메타데이터(수 KB)만 선택적으로 다운로드한다. 나머지 99%는 필요할 때만 받는다. === Python 없이 동작 === pip은 모든 작업에 파이썬 인터프리터가 필요하고, 레거시 패키지의 메타데이터를 얻으려면 빌드 백엔드를 서브프로세스로 실행한다. uv는 TOML과 wheel 메타데이터를 Rust 코드로 네이티브 파싱하며, `setup.py`만 가진 레거시 패키지를 만날 때만 파이썬을 사용한다. === 성능 벤치마크 === 공식 벤치마크 기준 (Trio 패키지의 의존성 설치): {| class="wikitable" |- ! 상태 !! pip !! uv !! 속도 차이 |- | 콜드 캐시 (최초 설치) || ~수십 초 || 수 초 || 8~10배 빠름 |- | 워크 캐시 (재설치) || 수십 초 || 수백 ms || 80~115배 빠름 |- | 가상환경 생성 || 20~40초 || ~0.5초 || 약 60배 빠름 |- | 의존성 해결 (복잡한 그래프) || 수분 가능 || 수 ms~초 || 수십~수백배 |} [* 벤치마크 결과는 환경, 네트워크 상태, 패키지 복잡도에 따라 다를 수 있다.] 편집 요약 가온 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 가온 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요. 또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요! 취소 편집 도움말 (새 창에서 열림)