차밍이

[Python] Pandas 판다스는 과연 빠른가 ? 속도확인 value_counts, unique, drop_duplicates 본문

파이썬/기본 문법 정리

[Python] Pandas 판다스는 과연 빠른가 ? 속도확인 value_counts, unique, drop_duplicates

2022. 6. 29. 13:34
반응형

목차

 

 

     

     

    파이썬을 사용해 데이터 분석을 진행할 때, 필수적으로 사용하는 라이브러리가 있다면 판다스와 넘파이가 있다.

    데이터를 많이 다루기 시작하면서 생각보다 DataFrame을 다루는 것이 느린 것 같다는 의문을 가지는 경우가 종종있다.

    그래서 데이터프레임의 매소드인 value_countsunique에 대해서 과연 정말 빠른지 확인을 해보았다.

     

    결론 먼저 애기하자면, 그냥 pandas사용하는 것이 맘편하다...ㅇㅅㅇ;

     

    속도 측정은 쥬피터의 %%timeit을 사용해서 시간을 측정하였다.

    %timeit에 대해서 더 알아보려면 아래 링크를 참고하면 된다.

    [파이썬] %timeit으로 jupyter notebook에서 Cell 단위 코드 수행 시간 확인하기

     

    [파이썬] %timeit으로 jupyter notebook에서 Cell 단위 코드 수행 시간 확인하기

    목차 들어가며 jupyter notebook 에서 셀 단위로 속도를 확인하는 방법을 알아보자. 속도를 비교해볼 함수 리스트의 원소들을 모두 곱하는 함수로 아래와 같다. def multiplyAll_v1(s:list) -> int: ans = 1 for n..

    chancoding.tistory.com

     


    DataFrame 10,000 line & unique value 1000개 짜리 데이터

    총 Row line 수가 1만 라인에 유니크안 값이 1000개 정도인 데이터에 대해서 진행해보았다.

    pandas.DataFrame.value_counts()

    value_counts를 위해서 비교군으로 dictionary를 사요했다.

    해당 key 값이 몇 번 발생했는지를 value로 저장하는 방식이다.

    데이터 자체가 훨씬 적은 경우에는 아래쪽의 dictionray방식이 훨씬 빨랐다.

    하지만 해당 데이터에서는 DataFrame을 사용하는 것이 더 빠르다.

     

    pandas.DataFrame.unique()

    uniqe한 값으로 있는지 없는지만 확인하면 되므로 비교군으로 set을 사용하였다.

    set을 사용하는 경우가 조금 더 빨랐다.

     


    DataFrame 70,000 line & unique value 1000개 짜리 데이터

    전체 데이터 자체가 훨씬 많은 경우로 확인해보았다.

    pandas.DataFrame.value_counts()

    데이터 자체의 수가 점점 많아지자 DataFrame을 사용하는 경우와 Dictionary를 사용하는 경우의 차이가 훨씬 커졌다.

    판다스를 사용하는 것이 훨씬 유리하다.

    pandas.DataFrame.unique()

    유니크한 값을 찾는 경우에서는 set을 사용하는 방식이 조금 더 빨랐다.

    크게 차이가 나지는 않는다고 본다.

     


    DataFrame 70,000 line & unique value 10000개 짜리 데이터

    이번에는 unique한 값들이 훨씬 많은 경우를 확인해보았다.

    pandas.DataFrame.value_counts()

    역시나 DataFrame이 훨씬 빠르다.

     

    pandas.DataFrame.unique()

    set을 사용하는 경우가 훨씬 빠른 것을 확인할 수 있다.


    DataFrame 16,000,000 line & unique value 100,000개 짜리 데이터

    1.3GB가 넘는 데이터를 사용해서 확인해보았다.

    pandas.DataFrame.value_counts()

    여전히 DataFrmae을 사용하는 것이 유리하다.

     

    pandas.DataFrame.unique()

    set을 사용하는 방식이 조금 더 유리하다.

    하지만, 전체적인 시간에 비해 큰 차이가 보이지는 않는다.

     


    DataFrame 16,000,000 line & unique value 2,500,000개 짜리 데이터

    pandas.DataFrame.value_counts()

    이제는 DataFrame이 더 느려졌다.

    pandas.DataFrame.unique()

    set을 사용하는 것이 훨씬 빠르다.


    중복되지 않은 특정 데이터 셋 찾기

    100줄 짜리 데이터프레임

    5만 줄 짜리 데이터프레임

     

    데이터가 작을 때에는 데이터프레임을 쓰는 것이 더 안좋지만,

    데이터의 크기가 커질수록 데이터프레임을 쓰는 것이 훨씬 좋은 성능을 보이고있다.


    결론

    데이터의 숫자와 결과를 비교해보면 패턴이 있다는 것을 쉽게 눈치챘을 것이다.

    DataFrame 전체 길이에 비해서 unique한 값들의 수가 많아질수록 set을 사용하는 것이 유리하다.

    unique한 값이 크게 많지 않다면 DataFramemethod를 사용하는 것이 유리하다.

    이 후, 1GB 이상의 데이터들에 대해서는 점차 데이터를 조회하는 것에 대한 시간이 오래걸리는 것을 유추할 수 있다.

    Dictionary 또한 Set과 마찬가지로 hash방식의 데이터 조회를 한다.

    unique한 데이터가 많은 마지막 Case를 보면 DataFrmae을 사용하는 방식이 더 늦어지는 것을 볼 수 있다.

    따라서,

    다루는 데이터가 1GB 이상의 대용량 데이터가 많고 unique한 값들 또한 많다면, SetDictionary를 사용한 함수를 따로 작성해서 사용하면 성능을 높일 수 있을 것이다.

    반면, 1GB 이상의 데이터가 많지 않고 그 이하의 용량을 가진 데이터를 다수 사용한다면, Pandas라이브러리를 편하게 사용하는 것이 훨씬 수고스럽지 않고 효율적이라고 볼 수 있다.

    맘편하게 Pandas쓰자..

    나의 경우도 대용량 데이터를 다루지만, 파일을 쪼개서 분석 및 처리를 진행하고 있어, 1GB 이상의 데이터의 비중이 매우 낮다.

    그래서 그냥 판다스를 써야겠다..

     

    추가적으로 데이터가 길던 짧던 len(df) 는 O(n) 으로 2us 고정인 것 같다.

     


    다른 방안?

    modin.pandas도 사용해보았지만, csv파일을 많이 읽고 다루다보니 Error가 많이 발생하기도 하고

    가끔은 오히려 복잡해서 더 늦어지는 경우가 많았다.

    안정성이 조금 떨어져서 오히려 불편하다고 느꼈다.

    Pandas에서 잘되었던 것들이 modin.pandas를 사용하면, 안되거나 오류를 발생하는 것들이 많다.

    파일 하나 하나의 크기가 크다면, modin을 사용하면 좋겠지만, 작을 파일들을 다수 사용하는 나는 그냥 판다스에 multiprocess를 사용하는 것이 더 빠르다고 느꼈다.

    반응형

    관련된 글 보기

    Comments