用Numba 对 Python 加速
numba - @jit修饰器
Python好上手,但是慢起来也是真的慢。最近在找办法加速Python中一个多层for循环,因为数据结构的原因一直感觉无解——直到发现了Numba的@jit这个东西。
怎么用?直接在函数名上加@jit就行(当然这可能是最初级的用法,还没有非常深入地学习)
但是numba对一些数据结构不太支持,可能需要对数据预处理一下。可查阅:
Numba Documentation
Supported Python features in CUDA Python
目前看下来numba似乎对numpy比较支持,python 中的list和dict都不能使用。因此可以用numpy.array()代替list,同时可以通过以下方式建立numba的Dict类型。
# key 为5位 tuple,value为float64
i_am_a_dict = numba.typed.Dict.empty(
key_type=numba.types.UniTuple(numba.types.int64, 5),
value_type=numba.types.float64, )
附Example (数据量越大越明显) :
import time
from numba import *
import numpy as np
@jit
def h(ss):
f = 0
q = 0
for a in range(ss):
for b in range(126):
for c in range(20):
for d in range(36):
for e in range(10):
for f in range(7):
for g in range(2):
f += 99.87
q += f**2
return q
start = time.time()
i = h(8)
print('time = ', time.time() -start)
加上@jit前
time = 12.544034481048584
加上@jit后
time = 0.3435640335083008
数据量扩大100倍之后:
加上@jit前
time = 347.4983913898468
加上@jit后
time = 0.6444885730743408