关于numba的介绍有很多,就是一个可以把大量重复代码即时编译为机器码来加快程序运行速度的库。优点是快,方便,但缺陷也很明显,如很多类型不兼容,使用时不太灵活,必须把f方法内包含的所有方法加上装饰器,在数值计算量小时反而会减慢速度等等...
import librosa
from numba import njit
import timepath = "/Users/birenjianmo/Desktop/learn/librosa/input/1你好.wav"
y, sr = librosa.load(path)
yy = y.tolist()def logtime(f):def setf(*args, **kw):number = 100start = time.time()for i in range(number):r = f(*args, **kw)end = time.time()print( "%s 耗时:%s s" % (f.__name__, end - start/number) )return rreturn setfdef gettopdata(y):data = []for i in range(1,len(y)-1):if y[i]>0 and y[i-1]<y[i]<y[i+1]:data.append(i)return data@logtime
@njit(fastmath=True)
def findall_numba(a):result = []data = []for i in range(1,len(a)):data.append( a[i]-a[i-1] )for pos in range(5, len(data)//3):for i in range(len(data)-pos):if abs(data[i] - data[i+pos]) < abs(data[i]) * 0.05:getp = Truep = [a[i]]r = 1while r < (len(data)-i)//pos:for j in range(pos):if abs(data[i+j] - data[i+pos*r+j]) > abs(data[i+j]) * 0.05:getp = Falsebreakif not getp:breakelse:p.append(a[i+pos*r])r += 1if len(p) > 4:result.append(p)return result@logtime
def findall(a):result = []data = []for i in range(1,len(a)):data.append( a[i]-a[i-1] )for pos in range(5, len(data)//3):for i in range(len(data)-pos):if abs(data[i] - data[i+pos]) < abs(data[i]) * 0.05:getp = Truep = [a[i]]r = 1while r < (len(data)-i)//pos:for j in range(pos):if abs(data[i+j] - data[i+pos*r+j]) > abs(data[i+j]) * 0.05:getp = Falsebreakif not getp:breakelse:p.append(a[i+pos*r])r += 1if len(p) > 4:result.append(p)return resultif __name__ == '__main__':a = gettopdata(yy)findall(a)findall_numba(a)
运行100次的平均时间 ,使用numba可以提升差不多7倍的速度
findall 耗时:1.180213589668274 s
findall_numba 耗时:0.17544831991195678 s