import numpy as np
import time
from numba import jit
from multiprocessing.dummy import Pool
def numpy_original(a,b):
y,x = np.indices((a,b),dtype=np.int32)
res = np.multiply(x,y)
return res
@jit(nopython=True,nogil=False)
def numba_gil(a,b):
res = np.zeros((a,b),dtype=np.int32)
for i in range(a):
for j in range(b):
res[i][j]=i*j
return res
@jit(nopython=True,nogil=True)
def numba_nogil(a,b):
res = np.zeros((a,b),dtype=np.int32)
for i in range(a):
for j in range(b):
res[i][j]=i*j
return res
def costtime(func,a,b):
times=100
param =[(a,b)]*times
t0=time.time()
with Pool(8) as p:
p.map(lambda x:func(x[0],x[1]),param)
t1 = time.time()
return t1-t0
if __name__=="__main__":
a = 10
b = 10
#numpy_dot(a,b)
numba_gil(a,b) # warmup
numba_nogil(a,b) # warmup
a = 5000
b = 5000
cost1 = costtime(numpy_original,a,b)
print('numpy 原生方法:',cost1)
cost2 = costtime(numba_gil,a,b)
print('numba加速关闭nogil:',cost2)
cost3 = costtime(numba_nogil,a,b)
print('numba加速开启nogil:',cost3)
"""
numpy 原生方法: 13.166807651519775
numba加速关闭nogil: 7.045409679412842
numba加速开启nogil: 5.6226959228515625
"""
结论:
numba对于数据量的的计算优化效果明显,nogil开启对多线程大约有20%以上的优化。