Interfacing with C

Numba supports calling C functions through CFFI and ctypes.

CFFI

Numba supports calling C functions wrapped with CFFI:

from numba import jit
from cffi import FFI

ffi = FFI()
ffi.cdef('double sin(double x);')

# loads the entire C namespace
C = ffi.dlopen(None)
c_sin = C.sin

@jit(nopython=True)
def cffi_sin_example(x):
    return c_sin(x)

ctypes

Numba also supports calling C functions wrapped with ctypes:

# This example doesn't work on Windows platforms
from ctypes import *
from math import pi
from numba import jit, double

proc = CDLL(None)

c_sin = proc.sin
c_sin.argtypes = [c_double]
c_sin.restype = c_double

@jit
def use_c_sin(x):
    return c_sin(x)

ctype_wrapping = CFUNCTYPE(c_double, c_double)(use_c_sin)

@jit
def use_ctype_wrapping(x):
    return ctype_wrapping(x)