Numba @jit — 지연·즉시 컴파일과 옵션
Numba @jit — 컴파일 모드와 옵션
Numba의 중심 기능은 numba.jit() 데코레이터예요. 함수에 이 데코레이터를 붙이면 Numba JIT 컴파일러가 최적화 대상으로 여겨요. 호출 모드에 따라 컴파일 옵션·동작이 달라져요.
지연 컴파일 (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