正常做法:采用Python列表来对每个数字保留N位有效数字
def round_sf(x,significant_figure=0):
fmt="%%.%dg"%(significant_figure)
return np.array([float(fmt%(i)) for i in x])
Numpy加速版做法:
def round_sf_np(x,significant_figure=0):
r=np.ceil(np.log(x)/np.log(10))
f=significant_figure
return np.round(x*(10**(f-r)),0)*(10**(r-f))
性能对比
x=np.array([1.99355,1123,123.456,12.456789,12.9923]*10000)
%%timeit
round_sf(x,3)
%%timeit
round_sf_np(x,3)
可以获得7倍加速效果,并且结果保持一致