当python程序里出现大量的条件判断时,要如何做到让程序运行的速度最快?
这是一直以来都遇到的问题,python的for if else结构速度很慢,特别是[for 里 if 嵌套if] 、[for if 并列 elif]的方法,
暂时写的算法里用的是:
1、np.where()、df.where、df.map替代一部分条件逻辑
2、把条件逻辑判断写到def()里,再apply或者是list(map())调用条件逻辑的def()
这两种方法都要比[for if 套 if]快很多,几乎在任何数据场景下。但是有没有更好的方法?
今天看到两个可能有优化效果的函数,记录一下。
来源:https://www.cnblogs.com/fengguozhuying/p/9171806.html
np.selcect()
np.select(condlist, choicelist, default=0)
condlist是首选条件,choicelist是候选的条件.(如果condlist满足那么choicelist就没用),default是两者都满足后还剩余的默认值.
例1:
t = np.arange(6)
t
Out[12]: array([0, 1, 2, 3, 4, 5])
np.select([t<6,t>2,True],[t+10,t-10,66]) #因为t<6都满足,索引执行t+10,t>2和默认值都不执行
Out[11]: array([10, 11, 12, 13, 14, 15])
np.select([t>3,t<1,True],[t+10,t+20,66]) #t>3时执行t+10,t<1时执行t+20,剩余的执行66
Out[14]: array([20, 66, 66, 66, 14, 15])
列2:
x = np.arange(10)
>>> condlist = [x<3, x>5]
>>> choicelist = [x, x**2]
>>> np.select(condlist, choicelist)
array([ 0, 1, 2, 0, 0, 0, 36, 49, 64, 81])
x<3执行条件的结果是0, 1, 2;
x>5执行结果是6,7,8,9,那么进入条件x**2,最后结果为36, 49, 64, 81;
中间的3,4,5没有条件执行到,则为默认返回条件0,0,0
np.select(condlist, choicelist,default='no')
Out[47]: array(['0', '1', '2', 'no', 'no', 'no', '36', '49', '64', '81'],
dtype=')
例3
来源:https://blog.csdn.net/pipisorry/article/details/51822775
def triangle_wave(x, c, c0, hc):
x = x - x.astype(np.int) #三角波的周期为1,因此只取x坐标的小数部分进行计算
return np.where(x>=c,0,np.where(xdef triangle._wave2(x, c, c0, hc):
x = x - x.astype(np.int)
return np.select([x>=c, xTrue], [0, x/c0*hc, (c-x)/(c-c0)*hc])
也可以使用default:return np.select([x>=c, x0, x/c0*hc], default=(c-x)/(c-c0)*hc)
使用piecewise()计算三角波形
def triangle_wave3(x, c, c0, hc):
x = x - x.astype(np.int)
return np.piecewise(x,
[x>=c, x0, # x>=c
lambda x: x/c0*hc, # x
lambda x: (c-x)/(c-c0)*hc]) # else
使用piecewise()的好处在于它只计算需要计算的值.因此在上面的例子中,表达式 “x/c0*hc”和“(c-x)/(c-c0)*hc”只对输入数组x中满足条件的部分进行计算。
调用
x = np.linspace(0, 2, 1000)
y4= triangle_wave3(x,0.6, 0.4, 1.0)
x = np.linspace(3, 9, 100)
cond = [x < 3, (3 <= x) & (x <= 9), x > 9];
func = [0, lambda x : (x - 3) / (9 - 3), 1];
np.piecewise(x, cond, func)