PEP 784 – 표준 라이브러리에 Zstandard 추가
- Author:
- Emma Harper Smith <emma at python.org>
- Sponsor:
- Gregory P. Smith <greg at krypto.org>
- Discussions-To:
- Discourse thread
- Status:
- Final
- Type:
- Standards Track
- Created:
- 06-Apr-2025
- Python-Version:
- 3.14
- Post-History:
- 07-Apr-2025
- Resolution:
- 25-Apr-2025
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain or CC0-1.0, whichever is more permissive 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
Zstandard는 널리 채택되었으며 성숙하고 매우 효율적인 압축 표준입니다. 이 PEP는 기본 구현인 Meta의 zstd 라이브러리를 감싸는 Python 래퍼를 포함하는 새 모듈을 Python 표준 라이브러리에 추가할 것을 제안합니다. 또한 PyPI의 패키지와 이름이 충돌하는 것을 방지하고 Python 사용자에게 통합된 인터페이스를 제공하기 위해, 표준 라이브러리의 압축 모듈을 compression.* 패키지 아래로 이동합니다.
동기
CPython에는 널리 사용되는 여러 압축 형식을 위한 모듈이 있으며, 여기에는 zlib (DEFLATE), gzip, bzip2, lzma 등이 있습니다. 널리 사용되는 압축 알고리즘을 포함하는 것은 폭넓게 유용한 표준과 유틸리티를 통합한다는 Python의 “배터리 포함” 철학에 부합합니다. lzma 는 Python 3.3에 추가된 가장 최근의 이러한 모듈입니다.
그 이후 Zstandard는 합리적인 CPU 및 메모리 비용으로 높은 압축률을 달성하면서 고성능 압축과 압축 해제를 모두 수행하는 현대의 de facto 선호 압축 라이브러리가 되었습니다. Zstandard는 bzip2나 zlib (DEFLATE)보다 훨씬 높은 압축률을 달성하며, LZMA보다 훨씬 빠르게 압축을 해제합니다.
Zstandard는 컴퓨팅의 여러 분야에서 widespread adoption을 이루었습니다. 수많은 하드웨어 구현은 Zstandard에 대한 장기적인 헌신과 Zstandard가 앞으로 수년간 압축을 위한 de facto 선택으로 남을 것이라는 기대를 보여 줍니다. 이는 RFC 8478 에서 Zstandard가 IETF 표준으로 제정된 사실로도 뒷받침됩니다. Zstandard 압축은 ZFS및 Btrfs 파일 시스템에도 구현되어 있습니다.
Zstandard의 매우 효율적인 압축은 그 높은 효율성으로 인해 brotli, lzo, ucl 등의 다른 최신 압축 형식을 대체했습니다. LZ4는 여전히 매우 높은 처리량이 필요한 시나리오에서 사용되지만, 이러한 일부 상황에서도 Zstandard를 사용할 수 있습니다. LZ4를 포함하는 것은 범위 밖이지만, 이 PEP에서 도입하는 compression 네임스페이스에 향후 추가하기에 매력적인 항목이 될 것입니다.
PyPI에는 Python용 Zstandard 바인딩이 여러 개 있으며, 각각 zstd 라이브러리를 바인딩하는 방식과 API가 서로 다릅니다. 표준 라이브러리에 공식 모듈을 도입하는 한 가지 목표는 Zstandard를 위한 간단한 압축/압축 해제 API를 원하는 Python 사용자의 혼란을 줄이는 것입니다. 기존 패키지는 계속해서 확장 API를 제공하거나 최신 Zstandard 버전의 기능을 통합할 수 있습니다.
표준 라이브러리에 Zstandard 지원을 추가하는 또 다른 이유는 tarfile 모듈에 Zstandard 지원을 요청하는 오랫동안 해결되지 않은 공개 이슈(python/cpython#81276)를 해결하기 위해서입니다. 이 이슈는 CPython 추적기의 공개 이슈 중 다섯 번째로 많은 “좋아요”를 받았으며, 상당한 논의와 관심을 불러일으켰습니다. 또한 ZIP 형식은 Zstandard compression format ID를 표준화하고 있으며, zipfile 모듈과 통합하면 Zstandard 압축을 사용하는 ZIP 아카이브를 열 수 있습니다. 이 PEP의 참조 구현에는 zipfile, tarfile, shutil 모듈과의 통합이 포함되어 있습니다.
Zstandard 압축은 Python 휠 패키지를 더 작게 만들고 설치 속도를 크게 높이는 데에도 사용할 수 있습니다. Anaconda는 conda 패키지 형식에 Zstandard를 채택했을 때 상당한 속도 향상을 확인했습니다.
Conda의 다운로드 크기는 약 30~40% 감소하고 추출 속도는 극적으로 빨라집니다. […] 전체적으로 약 2.5배의 속도 향상을 확인했으며, 이는 거의 전적으로 새 파일 형식에 사용된 zstd 압축의 극적으로 빨라진 추출 속도 덕분입니다.
Zstandard는 다양한 압축 라이브러리와 형식을 종합적으로 벤치마크한 according to lzbench에 따르면 wheel의 기존 zlib 기반 압축보다 압축률이 상당히 높습니다. 이 PEP는 wheel 형식이나 다른 패키징 표준에 대한 변경을 규정하지 않지만, 표준 라이브러리에 Zstandard 바인딩이 있으면 향후 PEP에서 Python wheel 패키지의 사용자 경험을 개선할 수 있습니다.
근거
compression 패키지 도입
zstd 및 zstandard 임포트 이름은 모두 PyPI의 프로젝트들이 사용하고 있습니다. 기존 바인딩 중 하나의 사용자를 위해 호환성을 깨뜨리지 않도록, 이 PEP에서는 압축 라이브러리를 위한 새 네임스페이스인 compression을 도입할 것을 제안합니다. 이 이름은 표준 라이브러리에서 사용하도록 PyPI에 이미 예약되어 있습니다. 새로운 Zstandard 모듈의 이름은 compression.zstd로 지정합니다. 다른 압축 모듈은 새로운 compression 패키지에서 다시 내보냅니다.
압축 모듈에 공통 네임스페이스를 제공하면 여러 가지 이점이 있습니다. 첫째, 압축 모듈을 어디에서 찾아야 하는지에 대한 사용자의 혼란을 줄입니다. 둘째, 최상위 compression 모듈은 hashlib의 algorithms_available와 유사하게 어떤 압축 형식을 사용할 수 있는지에 대한 정보를 제공할 수 있습니다. 관련 PEP 775가 채택되면 zlib을 나열하는 compression.algorithms_guaranteed도 제공할 수 있습니다. 마지막으로, compression 네임스페이스는 다른 압축 형식을 표준 라이브러리에 병합할 때 발생할 수 있는 향후 문제를 방지합니다. 새로운 압축 형식은 CPython에 통합되기 전에 PyPI에 먼저 게시될 가능성이 높습니다. 따라서 새로운 압축 형식의 임포트 이름은 모듈이 CPython에 포함될 대상으로 검토될 때 이미 사용 중일 가능성이 높습니다. 압축 모듈을 패키지 접두사 아래에 배치하면 향후 발생할 수 있는 이름 충돌 문제를 방지할 수 있습니다.
Python 버전 간 호환성을 유지하려는 코드는 호환성을 보장하기 위해 다음 패턴을 사용할 수 있습니다:
try:
from compression.lzma import LZMAFile
except ImportError:
from lzma import LZMAFile
이 패턴은 새로운 임포트 이름을 사용할 수 있을 때 사용하고, 그렇지 않으면 이전 이름으로 대체합니다.
pyzstd를 기반으로 한 구현
이 PEP의 구현은 pyzstd project를 기반으로 합니다. 이 프로젝트는 해당 코드가 Ma Lin에 의해 CPython에 originally written to be upstreamed되었고, Ma Lin이 현재 표준 라이브러리에서 사용하는 output buffer implementation도 작성했기 때문에 선택되었습니다. 이후 이 프로젝트는 Rogdham이 인수했으며 PyPI에 게시되고 있습니다. pyzstd의 API는 bz2 및 lzma와 같은 표준 라이브러리의 다른 압축 모듈 API와 유사합니다.
지원되는 최소 Zstandard 버전
지원되는 최소 Zstandard 버전은 2020년 5월에 릴리스된 v1.4.5로 선택했습니다. 이 버전은 LTS 릴리스를 포함하여 여러 Linux 배포 패키지 저장소에서 사용할 수 있는 Zstandard 버전을 검토한 결과를 바탕으로 최소 버전으로 선택했습니다. 이 버전 선택은 기존 LTS Linux 배포판과의 호환성을 극대화하기 위한 상당히 보수적인 선택이지만, 최신 Python 릴리스는 일반적으로 최신 배포판 릴리스의 일부로 패키지되므로 더 최신 버전의 Zstandard를 선택할 수도 있을 것입니다.
사양
compression 네임스페이스
압축 모듈을 위한 새로운 네임스페이스를 compression이라는 이름으로 도입합니다. 이 패키지의 최상위 모듈은 처음에는 비어 있지만, 향후 압축 루틴과 상호 작용하기 위한 표준 API가 최상위 모듈에 추가될 수 있습니다.
compression.zstd 모듈
표준 라이브러리의 다른 압축 모듈과 일치하는 Zstandard 압축 API를 제공하는 새로운 compression.zstd 모듈을 도입하며, 구체적으로는
compress()/decompress()- 한 번에 압축하거나 압축을 해제하기 위한 APIZstdFile/open()- 스트림 및 파일과 유사한 객체와 상호 작용하기 위한 APIZstdCompressor/ZstdDecompressor- 점진적 압축 또는 압축 해제를 위한 API
또한 일부 Zstandard 전용 기능도 포함합니다.
ZstdDict/train_dict()/finalize_dict()- Zstandard 딕셔너리와 상호 작용하기 위한 API이며, 유사한 데이터로 이루어진 작은 청크를 많이 압축하는 데 유용합니다.
libzstd 선택적 종속성
libzstd 라이브러리는 CPython의 선택적 종속성이 됩니다. 라이브러리를 사용할 수 없는 경우 compression.zstd 모듈을 사용할 수 없습니다. 이는 일반 빌드 환경 감지의 일부로 유닉스 플랫폼에서 자동으로 처리됩니다.
Windows에서는 CPython이 Windows용으로 의존하는 라이브러리를 빌드하는 데 사용되는 소스 종속성 에 libzstd가 추가됩니다.
기타 압축 모듈
Python 3.14에 새로운 가져오기 이름인 compression.lzma, compression.bz2, compression.gzip 및 compression.zlib가 도입되며, 각각 기존 lzma, bz2, gzip 및 zlib 모듈의 내용을 다시 내보냅니다. 앞으로 compression 서브모듈이 표준 가져오기 이름이 됩니다. 최소 지원 Python 버전 요구 사항상 가능해지는 경우 Python 문서에서는 기존 최상위 모듈 이름보다 새로운 압축 이름의 사용을 권장합니다.
비공개로 표시된 _compression 모듈은 즉시 compression._common._streams로 이름이 변경됩니다. 현재 이 모듈의 내용이 표준 라이브러리 압축 모듈의 스트림 API(예: LZMAFile)를 위한 I/O 관련 도우미이므로 새 이름이 선택되었습니다.
하위 호환성
이 PEP는 하위 호환성을 해치는 변경 사항을 도입하지 않습니다. 현재 기존 압축 모듈을 더 이상 사용하지 않도록 하거나 제거할 계획은 없습니다. 기존 모듈의 사용 중단 또는 제거 여부는 향후 결정에 맡겨지지만, 이 PEP가 수락된 시점으로부터 최소 5년이 지나기 전에는 이루어지지 않습니다.
보안 영향
새로운 C 코드와 마찬가지로, 특히 신뢰할 수 없을 가능성이 있는 사용자 입력을 처리하는 코드에는 메모리 안전성 문제가 발생할 위험이 있습니다. 작성자는 _zstd 코드를 퍼징하여 견고성을 보장할 수 있도록 libfuzzer와의 통합을 기여할 계획입니다. 또한 압축 및 압축 해제 루틴을 실행하는 여러 테스트가 있습니다. 이러한 테스트는 AddressSanitizer로 컴파일했을 때 오류 없이 통과합니다.
새로운 종속성을 도입하는 데에는 항상 보안 위험도 따르지만, zstd 라이브러리는 성숙했으며 각 커밋마다 퍼징되고 Meta의 버그 바운티 프로그램에 참여합니다.
이 내용을 가르치는 방법
새로운 모듈의 문서는 참조 구현 브랜치에 있습니다. 기존 모듈의 문서도 새로운 이름을 참조하도록 업데이트됩니다.
참조 구현
참조 구현 에는 _zstd C 코드, compression.zstd 코드, tarfile, shutil 및 zipfile의 수정 사항, 그리고 추가된 각 새 API 및 통합에 대한 테스트가 포함되어 있습니다. 또한 다른 압축 모듈의 재내보내기도 포함되어 있습니다.
거부된 아이디어
모듈 이름을 zstdlib로 지정하고 새로운 compression 네임스페이스를 만들지 않습니다.
새로운 compression 네임스페이스를 만드는 대신, zstdlib과 같은 다른 이름을 임포트 이름으로 찾는 방법이 있습니다. zst, libzstd, zstdcomp와 같은 여러 다른 이름도 제안되었습니다. 논의 과정에서 이러한 이름은 오타를 내기 너무 쉽거나 직관적이지 않은 것으로 밝혀졌습니다. 또한 표준 라이브러리에 추가되는 향후 압축 형식에서도 기존 임포트 이름 문제는 지속될 가능성이 높습니다. 일반적으로 사용되는 고속 압축 형식인 LZ4에는 임포트 이름이 lz4인 PyPI의 패키지, lz4가 있습니다. 각 압축 형식마다 이 문제를 해결하는 대신, 이미 선점된 compression 네임스페이스를 사용하여 한 번에 해결하는 것이 더 좋습니다.
Python 3.14에 실험적인 _zstd 패키지를 도입하십시오
이 PEP는 Python 3.14의 새로운 기능에 대한 베타 마감 시점에 가까워 발표되었으므로, 한 가지 제안은 패키징 도구가 더 일찍 사용할 수 있도록 패키지 이름을 비공개 모듈 _zstd로 지정하되 이름을 확정하지 않는 것이었습니다. 이렇게 하면 3.15 개발 기간 동안 최종 모듈 이름을 논의할 시간이 더 많아집니다. 그러나 비공개 모듈을 도입하는 방안은 호응을 얻지 못했습니다. 표준 라이브러리에서 비공개 모듈을 외부에서 사용할 때의 기대 사항과 계약은 명확하지 않습니다.
compression 대신 표준 라이브러리 네임스페이스를 도입하십시오
compression 네임스페이스의 한 가지 대안은 전체 표준 라이브러리에 std 네임스페이스를 도입하는 것입니다. 그러나 이는 합의된 의미 체계, 마이그레이션 경로 또는 패키지 이름이 없는 상황에서 Python 3.14에 적용하기에는 너무 큰 변경으로 여겨졌습니다. 또한 향후 std 네임스페이스를 도입하는 PEP에서 compression 하위 모듈을 std 네임스페이스로 평탄화하도록 언제든지 정의할 수 있습니다.
compression에 zipfile과 tarfile을 포함하십시오
압축은 보관 도구와 함께 자주 사용되므로 zipfile과 tarfile을 모두 compression 네임스페이스 아래에 두는 방안은 매력적입니다. 그러나 압축은 보관 도구에만 국한되지 않고 사용될 수 있습니다. 예를 들어 네트워크 요청을 gzip으로 압축할 수 있습니다. 또한 tar와 같은 형식은 자체적으로 압축을 포함하지 않고 외부 압축에 의존합니다. 따라서 이 PEP는 zipfile이나 tarfile을 compression 아래로 이동하는 것을 제안하지 않습니다.
compression 아래에 gzip을 포함하지 마십시오
관련 GZip format RFC는 여러 블록과 그 내용에 관한 메타데이터를 포함할 수 있는 형식을 정의합니다. 이러한 점에서 GZip은 ZIP 및 tar와 같은 보관 형식과 매우 유사합니다. 그럼에도 실제 사용에서는 GZip이 보관 형식이라기보다 압축 형식으로 취급되는 경우가 많습니다. 여러 언어에서 GZip을 분류하는 방식을 살펴보면, 압도적인 추세는 GZip을 보관 형식이 아닌 압축 형식으로 분류하는 것입니다.
또한 Python의 gzip 모듈은 주로 단일 블록 콘텐츠에 중점을 두며 다른 압축 모듈과 유사한 API를 제공하므로 compression 네임스페이스에 적합합니다.
Copyright
This document is placed in the public domain or under the CC0-1.0-Universal license, whichever is more permissive.