본문 바로가기

Tech/Tech Tips

Python의 성능을 높이는 방법

100만번 이상의 Euclidean Distance 연산을 할 일이 있었다.

Python으로 Single Processor 연산을 하였을 경우 15초 가량 소요가 되었는데

이를 줄일 방법이 필요했다.

 

1. Multi-Processing

요즘 CPU는 4개의 Core가 보편적이다. 

Python 연산을 하였을때 확인해보니 하나의 Core만 가지고 100% 점유율의 연산을 하는 것을 확인할 수 있었다. 

이를 Python의 Multi-processing을 이용하여 계산해보니 4개의 코어로 나누었을때 4배 가량 향상을 볼 수 있었다.

[참고] https://doorbw.tistory.com/205

 

파이썬(python) #24_ 멀티프로세싱(Multi-processing) 과 멀티쓰레딩(Multi-threading)

안녕하세요. 문범우입니다. 오랜만에 파이썬 관련 내용을 포스팅하게 되었습니다. 최근 자바 언어에 대해 다시 공부하면서 멀티 쓰레딩 개념을 학습중인데, 파이썬에서 해당 내용을 다뤄보지 않은 것 같아 간략하..

doorbw.tistory.com

2. Numba

Python을 쓰려면 속도를 포기하라는 말을 본것 같다.

위의 100만번 연산 15초를 개선하기 위해 C로 프로그래밍 해야하나 고민하며 리서치하던 중

Numba라는 훌륭한 오픈소스 패키지르 발견하였다. Numba는 파이썬 코드를 기계어 수준까지 바꿔주는 JIT 컴파일러라고 소개하고 있다. 사용법조차 너무 간단하고 훌륭하다. 

numba를 import하고 병목구간이 되는 함수바로 위에 @jit만 써주면 끝.

성능향상은 계산량이 많을 수록 두드러졌는데. 10배 이상의 효과가 있는 것 같다.

import numpy as np
import pandas as pd
from numba import jit
import time

SAMPLES = 1000000

arr_list = []

print('creating random vectors')
for i in range(SAMPLES):
  arr_list.append(np.random.randn(1,128)[0])


def euclidean_distance(x,y):
    return np.sqrt(np.sum((x-y)**2))

@jit(nopython=True) # <--- 병목구간이 되는 함수에 @jit만 붙혀줘도 OK
def euclidean_distance_numba(x,y):
    return np.sqrt(np.sum((x-y)**2))

 

3. 그 외

Cython, Pypy 와 같은 기능을 사용해도 엄청난 성능향상을 기대할 수 있을 것 같다.

하지만 간단한 수준은 Numba를 사용해도 충분하지 않을 까 싶다.

'Tech > Tech Tips' 카테고리의 다른 글

Graph DB  (0) 2019.11.18
리눅스에서 백그라운드 실행 Screen 명령어  (0) 2018.10.01