The website uses cookies. By using this site, you agree to our use of cookies as described in the Privacy Policy.

# Numba 开发手册（一）

### 一、5分钟quick start

Numba是一个python的即时编译器，其使用Numpy的arrays，functions和loops。当调用Numba修饰函数时，它被编译为机器代码即时执行，并且全部或部分代码随后可以以本机机器代码速度运行！（大概意思是部分代码给编译了，不是像之前一样解释运行）

```from numba import jit
import numpy as np

x = np.arange(100).reshape(10, 10)

@jit(nopython=True) # Set "nopython" mode for best performance, equivalent to @njit
def go_fast(a): # Function is compiled to machine code when called the first time
trace = 0
for i in range(a.shape[0]):   # Numba likes loops
trace += np.tanh(a[i, i]) # Numba likes NumPy functions
return a + trace              # Numba likes NumPy broadcasting

print(go_fast(x))```

```from numba import jit
import pandas as pd

x = {'a': [1, 2, 3], 'b': [20, 30, 40]}

@jit
def use_pandas(a): # Function will not benefit from Numba jit
df = pd.DataFrame.from_dict(a) # Numba doesn't know about pd.DataFrame
df += 1                        # Numba doesn't understand what this is
return df.cov()                # or this!

print(use_pandas(x))```

Numba中的@jit运算符能按照两种编译模式运行，nopython模式和object模式。例如上面的go_fast函数，nopython=true，将@jit设置为nopython模式。nopython编译模式的行为本质上是编译装饰函数，以便它完全运行而不需要Python解释器的参与。这是使用Numba jit装饰器的推荐和最佳实践方式，因为它可以带来最佳性能。

Numba是如何工作的：

Numba读取了@jit函数的python字节，并且分析优化代码，最后使用LLVM编译器生成函数的机器代码。

Numba中的decorators：

 @njit @njit(nopython=true)的简称

### 三、编译python代码，使用@jit

1、Lazy compilation

```from numba import jit

@jit
def f(x, y):
# A somewhat trivial example
return x + y```

2、Eager compilation

```from numba import jit, int32

@jit(int32(int32, int32))
def f(x, y):
# A somewhat trivial example
return x + y```

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

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

@jit可以使用的数据类型：

void: 空类型

int8,uint8 ...16...32...64等

intc, uintc 和 int, unsigned int是一样的

intp, uintp是pointer-sized integers (没有搞懂)

float32,float64

complex64,complex128

1、nopython:

2、nogil

3、cache

4、parallel

```@jit(nopython=True, parallel=True)
def f(x, y):
return x + y```
Measure
Measure
Summary | 8 Annotations

2021/02/07 11:59

2021/02/07 11:59
numpy做数字运算，并且常常有很多的循环，那么使用Numba就是一个很好的选择
2021/02/07 11:59
Numba适合numpy中的循环操作、numpy函数以及broadcasting。
2021/02/07 11:59

2021/02/07 12:00

2021/02/07 12:00

2021/02/07 12:00

2021/02/07 12:01