这篇博客 可能先会看看 关于numpy中怎么使筛选数据更快 然后会讲到python中的性能分析
我先用传统的时间分析来处理numpy中不同的两种筛选处理方式,(这个筛选方式的错误其实很低级,但我自己有点喜欢犯这个错误)时间分析分别用time.time()和time.clock()
def count_time(narray):
start = time.clock()
tmp1 = narray[narray[:,2]>=9]
tmp2 = tmp1[tmp1[:,3]>10]
end = time.clock()
print("Time cost")
print (str(end-start))
count_time(final_matrix)
Time cost
0.2029331441008253
def count_time(narray):
start = time.clock()
tmp1 = narray[(narray[:,2]>=9)&(narray[:,3]>10)]
end = time.clock()
print("Time cost :")
print (str(end-start))
count_time(final_matrix)
Time cost :
0.08848516002763063
可以从代码中看出,前一个就是分别用了两次筛选,但我仔细研究了一下numpy,它主要有两种方式,一种是view 一种是copy view其实就是换个别名,对view之后的对象操作也会改变原数据,而copy是重新开辟了一片内存来保存新对象,所以理所当然copy会比view更耗时间。
但是在numpy中除了直接用切片筛选是属于view的操作,其他的方式都是copy的操作(包括index 和我程序中的 布尔型mask筛选),所以我这个上面copy了两次,下面只是copy一次,所以下面的耗时会更短。尤其当你的筛选条件很多的时候,把他们写在一块会大大降低你的运行时间,也会减少你程序的运行空间。
然后因为一般来看时间,大多都会扯出time.time() time.clock()两者,我看到的解释是 前者是运行时间,其中包括CPU时间,IO时间以及等待时间,而后者只是看CPU时间,但是我的结果很奇怪,如下所示,我的clock所花的时间是大于我的time的(下面那个使用多个条件来筛选时,clock所花的时间是大于time的,这个有点奇怪,但是确实time是不稳定的,如结果所示)
def count_time(narray):
start = time.time()
tmp1 = narray[narray[:,2]>=9]
tmp2 = tmp1[tmp1[:,3]>10]
end = time.time()
print("Time cost")
print (str(end-start))
count_time(final_matrix)
Time cost
0.2323775291442871
count_time(final_matrix)
Time cost
0.21288275718688965
def count_time(narray):
start = time.time()
tmp1 = narray[(narray[:,2]>=9)&(narray[:,3]>10)]
end = time.time()
print("Time cost :")
print (str(end-start))
count_time(final_matrix)
Time cost :
0.06784677505493164
现在我就想着除了这种传统的自己设定start end 还有没有其他针对于python的性能分析工具
结果发现了cProfile!