본문 바로가기
Python, API

Python 3.11의 속도개선 (feat. 5950X vs 7950X)

by 오늘밤날다 2023. 1. 7.

 

 

작년 상반기쯤 Python 3.11b의 퍼포먼스 개선에 관한 기사들을 우연히 보게 되었다. 그 당시에 여러 가지 자료들이 있었지만 PyPerformance 자료만 봐도 기존 버전 대비 엄청난 성능향상을 보여줬다. 단순히 Python 버전업만 하더라도 프로그램들의 속도가 엄청나게 개선될 것이라고 생각해서 출시일을 손꼽아 기다려왔다. 

 

 

 

 

그리고 작년 10월 24일, Python 3.11의 정식버전으로 출시되자마자 찍먹을 해봤다. 퍼포먼스 측면에서는 체감이 될 정도로 개선됨이 느껴졌다. 그런데 그 당시에는 내가 사용 중이던 라이브러리들과 여러 가지 문제점들이 발견되어서 제대로 사용해볼 수가 없었고 아쉽지만 결국 Anaconda3의 최종 배포버전(Python 3.9)으로 돌아왔다. 그리고 이번에 5950X의 메인 PC를 7950X로 교체하면서 기존에 사용 중이던 Python 3.9 대신에 Python 3.11로 교체했다. 다행스럽게도 내가 사용하는 라이브러리 안에서는 문제들은 대부분 해결된 것 같았다. 

 

 

그렇다면 백테스트 프로그램의 소요시간은 얼마나 단축되었을까? 대략적으로 프로그램의 코드는 DB에 저장된 데이터를 읽어와서 몇 가지 데이터 전처리를 한 후에 Pandas.DataFrame.itertuples로 전체 자료를 대상으로 Loop를 돌린 후에 결과물을 정리, 손익자료를 요약해서 CSV로 저장하고 시각화된 정보를 PNG로 저장하는데 요소별로 나누어 소요시간을 측정해 보았다. 결과는 총 10회씩 프로그램을 실행한 후 평균값으로 산출했다. 

 

 

 

 

 

Single Thread - Python 3.9 VS Python 3.11  (5950X vs 7950X)

 

 

 

 

5950X에서 Python 3.9와 Python 3.11을 비교할 때 전체 소요시간이 1.880초에서 1.673초로 약 11%가량 단축되었다. 전반적으로 모든 영역에서 개선이 이루어졌는데 특히 전체 행을 대상으로 하는 Loop시간이 0.482초에서 0.403초로 개선되었다. 다만 Plotly 라이브러리를 사용해서 시각화자료를 만들고 PNG파일로 저장하는 시간이 차지하는 비중이 꽤 큰데 개선점이 없었다. 마찬가지로 Data_load1과 2 또한 개선이 없었는데 Python 자체의 성능보다는 Disk I/O 때문에 개선이 없는 것이 아닐까 싶기도 하다. 

 

 

 

7950X의 새 PC에 Python 3.11을 설치해서 5950X + Python 3.11과 결과를 비교해보았는데 1.673초에서 1.182초로 약 29%의 꽤 많은 속도 개선이 있었다. Data_load1,2와 Export_plot 부분도 속도 개선이 있었다. SSD의 속도 차이일까 생각해봤는데 두 PC 모두 SSD는 PM9A1M.2 NVMe를 사용하고 있어서 그것도 아닐 것 같은데 잘 모르겠다.

 

 

 

 

 

 

 

MultiProcessing - Python 3.9 VS Python 3.11  (5950X vs 7950X)

 

 

위 코드를 기준으로 변수들을 바꿔가며 총 1286개의 작업목록을 만든 후에 MultiProcessing을 해보았다. MultiProcessing시에는 Data_load의 경우 최초 한 번만 데이터를 가져온 후에 이를 전체 작업물에 하며 CSV나 PNG로 Export 하는 과정은 생략하고 결괏값만 계산하는데 Single thread의 경우에 Data_load와 Export과정을 제외한 결과는 아래와 같다.

 

 

 

 

 

 

위의 Single Thread와 동일하게 각각 5950X + Python 3.9, 5950X + Python 3.11, 7950X + Python 3.11의 조합으로 동일한 코드를 가지고 1286개의 작업목록에 대해서 MultiProcessing을 실행해 보았다. 결과는 5950X에서 Python 3.11은 Python 3.9 대비 3분 32초에서 2분 22초로 약 33%가량 소요시간이 개선되었다. 그리고 Python 3.11의 환경에서 7950X는 5950X 대비 2분 22초에서 1분 40초로 약 30%가량 시간이 단축되었다. 

 

 

 

 

 

Single Thread일 때의 차이와 비례해서 MultiProcessing에서 동일한 수준의 차이가 벌어질 거라 생각했는데 결과는 조금 달랐다. 아무튼 소프트웨어와 하드웨어를 모두 업그레이드했더니 기존 작업에 소요되는 시간이 53%나 감소했다. 이제 몇 가지 안정화 작업만 마치고 신나게 새로운 작업물을 뽑아봐야겠다.