다운로드
작성자: admin 작성일시: 2016-07-21 17:21:28 조회수: 3411 다운로드: 191
카테고리: Python 태그목록:

Numba와 Cython을 사용한 속도 향상

Numba와 Cython은 모두 파이썬 속도 향상을 위한 패키지이지만 작동 방식은 다음과 같이 서로 다르다.

  • Numba는 JIT(Just-In-Time) 컴파일러를 사용하여 파이썬 코드를 자동으로 최적화한다.

  • Cython은 사용자가 파이썬 코드와 유사한 코드를 입력하면 이를 기반으로 C 언어로 되어 있는 패키지를 생성한다.

Numba 사용법

일반 파이썬 버전

In:
from math import cos, log
def f_py(I, J):
    res = 0
    for i in range(I):
        for j in range (J):
            res += int(cos(log(1)))
    return res
In:
I, J = 2500, 2500
%time f_py(I, J)
CPU times: user 1.54 s, sys: 0 ns, total: 1.54 s
Wall time: 1.58 s
Out:
6250000

NumPy 버전

In:
def f_np(I, J):
    a = np.ones((I, J), dtype=np.float64)
    return int(np.sum(np.cos(np.log(a)))), a
In:
%time res, a = f_np(I, J)
CPU times: user 190 ms, sys: 0 ns, total: 190 ms
Wall time: 199 ms

Numba 버전

In:
import numba as nb
In:
f_nb = nb.jit(f_py)
In:
%time f_nb(I, J)
CPU times: user 130 ms, sys: 10 ms, total: 140 ms
Wall time: 143 ms
Out:
6250000

Cython

일반 파이썬 버전

In:
def f_py(I, J):
    res = 0.  # we work on a float object
    for i in range(I):
        for j in range (J * I):
            res += 1
    return res
In:
I, J = 500, 500
%time f_py(I, J)
CPU times: user 6.12 s, sys: 0 ns, total: 6.12 s
Wall time: 6.24 s
Out:
125000000.0

Cython 버전

In:
import pyximport
pyximport.install()
Out:
(None, )
In:
%load_ext Cython
In:
%%cython
#
# Nested loop example with Cython
#
def f_cy(int I, int J):
    cdef double res = 0
    # double float much slower than int or long
    for i in range(I):
        for j in range (J * I):
            res += 1
    return res
In:
%time res = f_cy(I, J)
CPU times: user 100 ms, sys: 0 ns, total: 100 ms
Wall time: 110 ms

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!