Numba @jit — 지연·즉시 컴파일과 옵션

Numba @jit — 컴파일 모드와 옵션

Numba의 중심 기능은 numba.jit() 데코레이터예요. 함수에 이 데코레이터를 붙이면 Numba JIT 컴파일러가 최적화 대상으로 여겨요. 호출 모드에 따라 컴파일 옵션·동작이 달라져요.

출처: https://numba.readthedocs.io/en/stable/user/jit.html

지연 컴파일 (Lazy compilation)

추천 방식은 Numba가 언제·어떻게 최적화할지 결정하게 두는 거예요. 컴파일은 첫 실행까지 연기되고, 호출 시점에 인자 타입을 추론해 최적화 코드를 만든다. 입력 타입에 따라 별도 전문화(specialization)도 컴파일할 수 있어요.

from numba import jit

@jit
def f(x, y):
    return x + y

즉시 컴파일 (Eager compilation)

기대하는 함수 시그니처를 미리 알려줄 수도 있어요.

from numba import jit, int32

@jit(int32(int32, int32))
def f(x, y):
    return x + y

반환 타입을 생략하면((int32, int32)) Numba가 추론해요. 시그니처는 문자열이 될 수도 있고 여러 개를 리스트로 전달할 수도 있어요.

다른 함수 호출·인라인

Numba 컴파일 함수는 다른 컴파일 함수를 호출할 수 있고, 최적화기 휴리스틱에 따라 인라인될 수 있어요.

@jit
def square(x):
    return x ** 2

@jit
def hypot(x, y):
    return math.sqrt(square(x) + square(y))

이런 라이브러리 함수에는 @jit를 반드시 붙여야 해요. 안 붙이면 훨씬 느린 코드가 생성될 수 있어요.

컴파일 옵션

nopython

nopython 모드가 기본이고 훨씬 빠른 코드를 만들지만 제약이 있어요.

@jit  # Numba 0.59 이후로는 @jit(nopython=True) 또는 @njit와 동일
def f(x, y):
    return x + y

nogil

Numba가 파이썬 객체가 아닌 네이티브 타입·변수만 다루는 코드로 최적화하면 GIL을 붙잡을 필요가 없어요. nogil=True를 전달하면 컴파일 함수 진입 시 GIL을 놓아줘요. 다만 멀티스레딩의 일반적 함정(일관성·동기화·경쟁)에 주의해야 해요.

cache

프로그램 실행마다 컴파일 시간을 피하려면 파일 기반 캐시에 쓰도록 cache=True를 전달해요. 캐싱은 함수 단위가 아니라, 메인 jit 함수와 그 함수가 호출하는 모든 보조 함수가 메인 캐시에 통합돼요.

@jit(cache=True)
def f(x, y):
    return x + y

parallel

@jit(nopython=True, parallel=True)
def f(x, y):
    return x + y

더 알아보기