最近在看深度学习加速计算时,发现了numba加速库,声称能加速python运行速速度高达百倍
首先是测速的工具
常规的测速工具是time.time()
,但是在internet上看到有人说,这个不准确,python有个强大的代码测速库:timeit
,于是就斗胆
用这个试试。
然后就开始造一个例子:那就求一个二维数组的和吧!
首先用python原生的列表:
def go_pylist():
a = list(range(100))
b = list(range(100))
c = []
for i in range(len(a)):
a[i] = i ** 2
b[i] = i ** 3
c.append(a[i] + b[i])
return c
然后定义numpy:
def go_numpy():
x = np.arange(100)
y = np.arange(100)
z = x**2 + y**3
return z
最后numba,语法倒挺简单,用jit装饰器就可以了:
@jit(nopython=True) # jit,numba装饰器中的一种
def go_numba(): # 首次调用时,函数被编译为机器代码
x = np.arange(100)
y = np.arange(100)
z = x**2 + y**3
return z
利用timeit计算耗时结果(每个函数跑他个100遍):
timeit的number参数:表示当前测速的程序运行几遍
print('python List:', timeit('go_pylist()', 'from __main__ import go_pylist', number=100))
print('python numpy:', timeit('go_numpy()', 'from __main__ import go_numpy', number=100))
print('python numba + numpy 首次编译:', timeit('go_numba()', 'from __main__ import go_numba', number=100))
print('python numba + numpy 再次运行:', timeit('go_numba()', 'from __main__ import go_numba', number=100))
迫不及待看结果喽:
python List: 0.005218099999183323
python numpy: 0.0003794999975070823
python numba + numpy 首次编译: 0.8580956000005244
python numba + numpy 再次运行: 0.00011240000094403513
差别不大,我再跑1000遍:
python List: 0.05830569999670843
python numpy: 0.00400420000005397
python numba + numpy 首次编译: 0.975803299999825
python numba + numpy 再次运行: 0.0008096999990812037
一给我里giao giao:
numpy提速已经很离谱啦!!!但是numba好像没那么叼哎!
第一次运行numba,耗时尽然普遍超过python原生列表和numpy,我叹为观止!
再次运行就遥遥领先
。numba运行两次才能提速,那两次加起来不是更耗时么??谁能给我解答一下?
PS:忽略产生数据的速度差异了,而且,我好像混淆了计算加速和运行代码加速,不过没啥影响,numba和numpy对比就可以了!