Pandas vs. Polars
프로그래밍/Python

Pandas vs. Polars

네이버 인턴이 끝나고 최근들어 다시 Kaggle을 시작하였는데 정형데이터를 다루는 대부분의 대회에서 다들 Polars라는 라이브러리를 사용하고 있고, 직접 사용해 보면서도 Pandas보다 월등하게 빠른 모습을 보여주었기 때문에 궁금해서

  • Pandas가 왜 느린지
  • Polars?

에 대하여 조사해보았다.

1️⃣ Pandas는 왜 느리다고 할까?

바뀐 Pandas 신 로고

Pandas는 Numpy와 Mathplotlib 기반으로 이루어진 Data 분석용 라이브러리이다. Pandas는 자체적으로 Series와 DataFrame 2가지의 형식을 제공하면서 다양한 통계적인 연산등을 제공한다.

  • Numpy 기반의 혼합 Python Package (일부 연산은 최적화를 위한 Cython 등으로 구현)
  • 정형 데이터를 다루는데 최적화 되어있다

다만 Pandas에 대해서 설명하려는 글은 아니기 때문에 본론으로 들어가보자

 

Pandas는 느리다

 

Pandas는 Numpy를 기반으로 만들어 졌다고 했는데 실제 Numpy와 같은 연산을 했을 경우 다음과 같이 차이가 많이 난다

차이가 심하게 많이 난다

그래서 왜 Pandas 는 느린걸까?

 

여러곳에서 교차적으로 조사한 결과 다음과 같은 공통적인 이야기가 존재한다

  • Numpy array에 추가적으로 Label, row, columns, index와 그 외의 Metadata가 필요함
  • 기능이 많기 때문에 이러한 기능을 사용하기 위한 무결성과 유연성을 위하여 추가적인 작업, 변환이 필요함
  • Python으로 코드가 작성되어있다 (GIL)
    • 기본적으로 Single 코어에서 동작
    • 태생적으로 느린 코드 한계 (인터프리터 언어)

이러한 이유로 인하여 다른 언어 기반으로 만들어진 모듈에 비해 속도가 느릴수 밖에 없는 한계가 존재한다.

 

2️⃣ Polars 🐻‍❄️?

Polars는 빠른 오픈소스 데이터 처리 및 분석 특화 라이브러리이다.. H2O에서 2021년에 진행한 DataFrame Benchmark에서 볼 수 있듯 다른 라이브러리에 비교하여 좋은 성능을 보여준다.

 

Benchmark 이미지

더보기
H2O Benchmark

Polars의 특징

Polars User Guide에서 말하는 Polars가 추구하는 Goal은 다음과 같다

  • 시스템에서 사용할 수 있는 모든 코어 사용
  • 쿼리 최적화를 통한 불필요한 작업 / 메모리 사용 줄이기
  • 사용가능한 RAM보다 더 큰 Dataset 다루기
  • 일관성 있고 예측 가능한 API
  • 엄격한 Schema (쿼리 실행 전 데이터 유형을 알아야 함)

위의 Goal들을 실현하기 위해 Polars는 Pandas와 다르게 다음과 같은 특징을 가진다.

Rust 기반의 코드

Python으로 이루어진 Pandas와는 다르게 Polars는 Rust로 코드가 작성되어있다. 이러한 이유로 인하여 병렬적인 코드구현에 뛰어나며, 메모리 안정성 또한 가질 수 있다.

  • GIL에 영향을 받지 않음
  • 멀티 코어로 동작

추가적으로 최적화된 알고리즘을 이용하여 중복 복사를 최소화하고, 효율적인 캐시 메모리 사용, 병렬시 경합을 최소화시켜 더욱 빠르게 동작할 수 있게 한다

Lazy execution 지원

Polars는 Pandas와 유사한 Series, DataFrame과 더불어 LazyFrame을 지원한다

필요한 부분만 연산하는 Lazy 방식을 지원함으로써 필요한 부분은 빠르고, 필요하지않는 부분은 무시하는 방식의 연산을 가능하게 해준다. 이를 통하여 메모리 효율적이면서, 빠르게 작업이 가능하다


여기까지 Polars에 대한 간결한 설명을 마치도록 한다.

 

실제로 대회에서도 사용해보면서 Pandas에서는 8s 이상 걸리던 전처리를 Polars로 바꾸면서 매우 빨라졌다는것을 느낄 수 있었다. 다만 기존에 Pandas에 많이 익숙해져 있는 나로써 Polars의 기능, 표현방법이 Pandas와 비슷하지만 또 다른부분도 적잖이 존재했기 때문에 이를 찾는데 조금 시간이 많이 걸려 일부 불편했던 부분또한 존재하였다

 

아마 다음 포스팅으로는 Polars를 가지고 대회를 진행하면서 사용했던 기능, 함수등을 정리하고 장단점에 대해서 추가적으로 이야기 할 예정이다.

Reference

[1] https://pola-rs.github.io/polars-book/user-guide/

[2] https://h2oai.github.io/db-benchmark/