- [Python] Polars, 빠른 속도와 낮은 메모리의 DataFrame 라이브러리2025년 04월 04일
- 홀쑥
- 작성자
- 2025.04.04.:33
Polars
이번 글에선 Python의 라이브러리인 Polars에 대해 알아보려고 한다.
Polars란?
Polars란 Rust 기반으로 작성된 고성능 DataFrame 라이브러리로 Python에서는 binding을 통해 사용한다.
일반적으로 사용하는 Pandas보다 적은 메모리로 더 빠른 연산을 수행할 수 있고, 지연평가(Lazy Evaluation)를 사용할 수 있어 대규모 데이터 작업에 유리하다.
Python Binding은 다른 프로그래밍 언어로 작성된 코드를 파이썬에서 호출할 수 있도록 연결해 주는 Interface, Polars에선 PyO3 패키지를 사용
DataFrame이란 데이터를 행과 열로 구성된 2차원 표(스프레드시트와 비슷)로 정리하는 데이터 구조로 데이터 분석 및 처리에서 보편적으로 쓰이는 데이터 구조
Polars 특징
공식문서에서 Polars의 주요 기능을 다음으로 정의한다.
- 빠르다.
- Rust 기반 초고속 엔진
- 다양한 스토리지 지원
- Csv, Parquet, JSON, IPC 등의 Local Storage
- S3, GCS 등의 Cloud Stroage
- DuckDB, Postgres 등에서의 Database에서 Fetch
- Streaming read/write도 결합 가능
- 직관적인 API 및 내부 최적화
- 내부 쿼리 최적화로 가장 효율적인 방법으로 실행(.explain() 또는. show_graph()으로 작업계획 확인가능)
- Predicate Pushdown(데이터를 읽기 전에 필터 적용)
- Projection Pushdown(필요한 컬럼만 추출)
- Slice Pushdown(필요한 slice만 load)
- Common Subplan Elimination(중복 쿼리 제거)
- Simplify Expressions(표현식 단순화)
- Join Ordering(Join 순서 최적화)
- Type Coercion(작업 성공 후 메모리 효율을 위한 타입 강제)
- Cardinality Estimation(카디널리티 추정)
- https://docs.pola.rs/user-guide/lazy/optimizations/
- 내부 쿼리 최적화로 가장 효율적인 방법으로 실행(.explain() 또는. show_graph()으로 작업계획 확인가능)
- Out of Core
- Streaming API를 통해 메모리에 전체 파일을 로드하지 않고, chunk단위로 처리
- 병렬 처리
- 따로 설정이 없어도 가능한 모든 CPU를 활용하여 작업을 나누어 처리
- Rust의 rayon 기반(병렬 처리 라이브러리)
- 벡터 쿼리 엔진
- 내부 연산이 CPU 캐시 최적화 및 AVX를 통한 연산 병렬화 가능
- GPU 지원
- 선택적으로 in-memory 작업에 대해 최대 효율을 내기 위해 NVIDIA GPU에서 쿼리를 실행
- Apache Arrow 지원
- Zero-copy를 통하여 Arrow Data를 소비하고 생성 가능
- PyArrow나 Arrow를 구현이 내부적으로 있진 않지만, Polars만의 연산 및 버퍼가 구현되어 있음
Polars 설치
Polars는 pip로 간단하게 설치가 가능하다.
pip install polars
하지만 만약 AVX2를 지원하지 않는 CPU라면 polars를 설치 시 다음과 같은 경고가 발생한다.
AVX(Advanced Vector Extensions)는 AMD, Intel x86 CPU에 탑재된 SIMD 확장으로 벡터 연산을 CPU에서 고속으로 처리.
AVX, AVX2, AVX-512가 있으며 Intel Sandy Bridge(2세대)부터, AMD Bulldozer부터 지원
AVX2는 Intel Haswell 4세대 및 Ryzen 1세대부터 지원RuntimeWarning: Missing required CPU features. The following required CPU features were not detected: avx, avx2, fma, bmi1, bmi2, lzcnt, movbe Continuing to use this version of Polars on this processor will likely result in a crash. Install the `polars-lts-cpu` package instead of `polars` to run Polars with better compatibility. Hint: If you are on an Apple ARM machine (e.g. M1) this is likely due to running Python under Rosetta. It is recommended to install a native version of Python that does not run under Rosetta x86-64 emulation. If you believe this warning to be a false positive, you can set the `POLARS_SKIP_CPU_CHECK` environment variable to bypass this check.
따라서 환경변수를 통해 CPU_CHECK를 없애거나 polars-lts-cpu를 설치해 사용한다.(성능이 낮아질 수 있음)
# 환경변수 설정, AVX2가 있으나 container 환경 등의 이유로 인식되지 않을 때 export POLARS_SKIP_CPU_CHECK=1 # lts-cpu 버전 polars 설치, AVX2가 없는 CPU에서 사용 pip install polars-lts-cpu # 리눅스일 때, avx2 지원여부 확인 grep avx2 /proc/cpuinfo
Polars 예제
먼저 pandas는 df, numpy는 np와 같은 약어로 polars는 pl을 사용한다.
import polars as pl
다음은 Pandas의 데이터프레임과 같이 Polars의 데이터 프레임을 정의하고 출력해 본다.
import polars as pl import datetime as dt df = pl.DataFrame( { "name": ["Alice Archer", "Ben Brown", "Chloe Cooper", "Daniel Donovan"], "birthdate": [ dt.date(1997, 1, 10), dt.date(1985, 2, 15), dt.date(1983, 3, 22), dt.date(1981, 4, 30), ], "weight": [57.9, 72.5, 53.6, 83.1], # (kg) "height": [1.56, 1.77, 1.65, 1.75], # (m) } ) print(df)
출력 결과 또한 Polars로 간단하게 csv로 저장 후 read 하여 다시 출력하는 예제이다.
# 이전 작성 코드에서 df.write_csv('sample.csv') df_csv = pl.read_csv('sample.csv', try_parse_dates=True) print(df_csv)
출력 결과 마무리
이로써 Polars를 간단하게 알아보았다.
다음번엔 Polars의 데이터 타입 및 구조들에 대해 정리해 볼 것이다.
참고자료
- https://www.databricks.com/kr/glossary/what-are-dataframes
- https://docs.pola.rs/
- https://en.wikipedia.org/wiki/Advanced_Vector_Extensions
- https://techblog.woowahan.com/18632/
다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)