차밍이
[Python] Pandas 판다스는 과연 빠른가 ? 속도확인 value_counts, unique, drop_duplicates 본문
[Python] Pandas 판다스는 과연 빠른가 ? 속도확인 value_counts, unique, drop_duplicates
2022. 6. 29. 13:34목차
파이썬을 사용해 데이터 분석을 진행할 때, 필수적으로 사용하는 라이브러리가 있다면 판다스와 넘파이가 있다.
데이터를 많이 다루기 시작하면서 생각보다 DataFrame
을 다루는 것이 느린 것 같다는 의문을 가지는 경우가 종종있다.
그래서 데이터프레임의 매소드인 value_counts
와 unique
에 대해서 과연 정말 빠른지 확인을 해보았다.
결론 먼저 애기하자면, 그냥 pandas사용하는 것이 맘편하다...ㅇㅅㅇ;
속도 측정은 쥬피터의 %%timeit을 사용해서 시간을 측정하였다.
%timeit에 대해서 더 알아보려면 아래 링크를 참고하면 된다.
[파이썬] %timeit으로 jupyter notebook에서 Cell 단위 코드 수행 시간 확인하기
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한 값이 크게 많지 않다면 DataFrame
의 method
를 사용하는 것이 유리하다.
이 후, 1GB 이상의 데이터들에 대해서는 점차 데이터를 조회하는 것에 대한 시간이 오래걸리는 것을 유추할 수 있다.
Dictionary
또한 Set
과 마찬가지로 hash
방식의 데이터 조회를 한다.
unique한 데이터가 많은 마지막 Case를 보면 DataFrmae
을 사용하는 방식이 더 늦어지는 것을 볼 수 있다.
따라서,
다루는 데이터가 1GB 이상의 대용량 데이터가 많고 unique한 값들 또한 많다면, Set
과 Dictionary
를 사용한 함수를 따로 작성해서 사용하면 성능을 높일 수 있을 것이다.
반면, 1GB 이상의 데이터가 많지 않고 그 이하의 용량을 가진 데이터를 다수 사용한다면, Pandas
라이브러리를 편하게 사용하는 것이 훨씬 수고스럽지 않고 효율적이라고 볼 수 있다.
맘편하게 Pandas
쓰자..
나의 경우도 대용량 데이터를 다루지만, 파일을 쪼개서 분석 및 처리를 진행하고 있어, 1GB 이상의 데이터의 비중이 매우 낮다.
그래서 그냥 판다스를 써야겠다..
추가적으로 데이터가 길던 짧던 len(df) 는 O(n) 으로 2us 고정인 것 같다.
다른 방안?
modin.pandas
도 사용해보았지만, csv
파일을 많이 읽고 다루다보니 Error가 많이 발생하기도 하고
가끔은 오히려 복잡해서 더 늦어지는 경우가 많았다.
안정성이 조금 떨어져서 오히려 불편하다고 느꼈다.
Pandas에서 잘되었던 것들이 modin.pandas
를 사용하면, 안되거나 오류를 발생하는 것들이 많다.
파일 하나 하나의 크기가 크다면, modin
을 사용하면 좋겠지만, 작을 파일들을 다수 사용하는 나는 그냥 판다스에 multiprocess
를 사용하는 것이 더 빠르다고 느꼈다.
'파이썬 > 기본 문법 정리' 카테고리의 다른 글
[Python] 랜덤한 데이터로 DataFrame 만들기 (0) | 2023.01.26 |
---|---|
Pandas DataFrame 성능 빠르게하기 - apply말고 Vectorization쓰자 (2) | 2023.01.02 |
[Python] 파일 및 폴더 디렉토리 삭제하는 법 총정리 (0) | 2022.12.13 |
[Python] datetime 모듈 날짜 시간 포맷 맞추기와 포맷 코드 종류 (0) | 2022.07.08 |
[Python] 멀티 프로세싱 사용하기 - 멀티 프로세싱 적용을 위한 함수들 알아보자 (0) | 2022.06.08 |
[Python] 패키지 구성을 위해 __init__ 파일과 __all__에 대해 알아보자 (0) | 2022.06.06 |
[Python] 파이썬 패키지란? - package에 대한 설명 및 예시 (0) | 2022.06.05 |
[Python] 모듈 vs 스크립트 vs 패키지 차이점을 알아보자 (0) | 2022.06.04 |