서론
※ 시간이 없으면 바로 본론으로!
파이썬에 대해 공부하다보면 자주 보는 말이 있다.
파이썬이 요즘 대세이다, 파이썬은 배우기 쉽다, 파이썬은 활용 폭이 넓다 등등...
위와 같은 장점들과 더불어 가장 많이 언급되는 단점이 하나 있는데, 바로 파이썬은 느리다는 것이다.
주로 비교되는 대상이 C언어인 것 같은데, 속도의 차이는 인터프리터와 컴파일러의 차이에 기인한다고 한다.
자세한 내용은 모르지만 대강 이해한 대로 비유를 곁들여 설명하자면 아래와 같다.
외국인에게 무언가를 시켜야 하는 상황이라고 가정한다.(내 컴퓨터가 바로 외국인이다.)
인터프리터의 경우 내가 하고 싶은 말을 통역사에게 하고 통역사가 외국인에게 그 말을 번역해서 다시 전달한다.
내가 말을 하고 그 말이 전달되는 사이에 번역 과정이 있기 때문에 느릴 수밖에 없다.
반면 컴파일러의 경우 할 말을 미리 번역해두었다가 전달하는 식이기 때문에 실행 속도가 빠르다는 것이다.
그 밖에도 동적 언어니 뭐니 하는 많은 이유로 인해 파이썬은 느리다고 한다.
조그만 프로그램들을 나름대로 만들어서 돌리다 보면 느린 속도가 체감될 때가 많다.
그래서 좀 빠르게 만들 방법이 없나 알아보니, 역시나 이러한 단점을 보완하기 위한 도구들이 다수 있었다.
그 중에 가장 간편해 보이는 라이브러리인 NUMBA를 소개한다.
본론
NUMBA의 소개를 읽어보면, 파이썬 라이브러리이지만 컴파일을 한다고 한다.
다만 C언어처럼 미리 컴파일을 하는 것은 아니고 Just-in-time를 컴파일러라고 하는데, 영어 뜻 그대로 프로그램 실행 즉시 컴파일을 한다는 뜻이다.
따라서 프로그램 내에서 함수를 처음 실행할 때에는 컴파일할 시간이 필요하며, 2번째 이상 실행할 때에 비해서는 시간이 좀 더 걸리는데, 이 때도 순수 Python으로 할 때보다는 훨씬 빠르다.
설치 방법은 여느 라이브러리들과 같다. 터미널을 열고 pip install numba를 입력하면 설치가 된다.
기본적인 사용방법은 아래와 같다. 매우 간단하다.
우선 numba에서 jit을 임포트한다.
from numba import jit
그리고 jit을 적용하고 싶은 함수를 정의하면 되는데, 그 앞에 @로 시작하는 데코레이터를 붙인다.
@jit(nopython=True)
def function():
......
nopython=True를 빼고 그냥 @jit만 붙여도 된다.
(nopython=True를 넣게 되면 numba가 컴파일 할 수 없는 코드가 있는 경우 오류가 나면서 중단되고, 넣지 않으면 순수 python과 같은 속도로 실행되는데, 속도 향상이 없다면 numba를 쓸 이유가 없을 것 같다.)
그리고, 정의한 함수를 실행하면 끝이다. 매우 간단하다.
하지만 그 효과는 대단하다. 아래 예시로 얼마나 빨라지는지 확인해보자.
그다지 유용해 보이지는 않지만 무려 1억 번의 연산이 필요한 함수인데, 순수 Python으로 돌려보니 11.8초가 걸렸다.
numba를 적용해보자.
컴파일할 시간을 포함하더라도 1초밖에 안 걸린다.
이제 컴파일이 되었으니 두 번만 더 실행해보자.
이번에는 0.1초도 걸리지 않는다.
순수 Python으로 할 때와 몇 배 차이가 나는지 계산해보자.
1회 실행 때는 11.5배 빨랐고, 2회 실행 때는 5800배, 3회 실행 때는 4800배 빨란다.
들인 노력에 비해서는 상당한 차이가 아닌가 싶다.
마무리
예제의 결과를 보면 대단한 발견이라는 생각이 든다.
겨우 코드 두 줄을 추가해서 5천 배 차이를 얻을 수 있다면 대단하지 않은가?
다만 모든 함수에서 다 이러한 결과를 볼 수 있는 것은 아니라고 한다.
예시와 같이 for문이 많이 반복되는 수치 연산에서 가장 효과적이라고 하며, Numpy와 함께 사용하기 좋지만, Pandas는 numba가 이해하지 못한다고 한다.
Pandas 애용자로서 아쉬운 점이지만, 언젠가는 numba를 요긴하게 써먹을 일이 있지 않을까 싶다.
'코딩 > Python' 카테고리의 다른 글
회사에서 pip install 오류날 때(SSLCertVerificationError) (0) | 2021.11.26 |
---|---|
파이썬에서 코드 한줄로 리스트(딕셔너리, 집합, 제너레이터) 만들기/리스트컴프리헨션, list comprehension (0) | 2021.11.26 |
파이썬 문자열 포맷팅 방법/f-string과 format 함수 (0) | 2021.11.26 |
스마트폰에서 주피터노트북(Jupyter notebook) 사용하는 방법/Pydroid 3, 태블릿, 안드로이드 (2) | 2021.11.18 |
스마트폰에서 파이썬(Python) 코딩하는 방법/Pydroid 3, 태블릿, 안드로이드 (4) | 2021.11.17 |
댓글