评估算法的性能
我们要想去度量一个算法的性能,有多种方法,比如度量算法的运行时间,统计指令,度量算法所使用的内存等方法,下面我们一个一个的来解读一下
1.度量算法的运行时间
度量算法的运行时间的一种方法是,利用计算机自带的一个计时器,来获取一个循环所执行的运行时间,我们通过连续几个循环的执行时间从而找出每一个循环之间数字和时间的关系,比如每一次循环的时间都会以指数级增长等。我们来看看下面的python代码,这一段代码设计了多次循环,并利用计算机本身的时钟进行计时,每一个循环之间的时间关系是怎样的呢?
import time problemSize=100000 for count in range(10): start=time.time() work=1 for x in range(problemSize): work+=1 work-=1 elapsed=time.time()-start print("%12d%16.3f"%(problemSize,elapsed)) problemSize*=2
这段Python代码的运行结果为:
100000 0.015 200000 0.028 400000 0.052 800000 0.101 1600000 0.205 3200000 0.419 6400000 0.862 12800000 1.699 25600000 4.483 51200000 6.667
我们可以看到,基本上当问题的大小翻倍的时候,运行的时间也会进行翻倍,利用这个规律再计算之后下一个循环的运行时间就没有什么难度了,当然后面当问题的大小太大的时候,可能不会以这个规律进行运算,但是对规模较小的情况下还是适用的。
2.统计指令
用于估算算法的另一种艺术,用于统计不同问题规模所需要执行的指令的个数,这种方式比度量算法运行时间可能会更加精确一些,但是我们需要记住,这个统计是用于统计高级语言当中的指令个数而不是低级语言(机器语言)当中的指令个数。在分析算法的时候,我们分为两类指令来分别进行统计:
1.不管问题的规模有多大,都执行相同次数的指令
2.根据问题的规模,执行不同次数的指令
我们来看下下面的循环针对不同数据集内部的循环会迭代多少次:
import time problemSize=1000 for count in range(5): number=0 work=1 for i in range(problemSize): for k in range(problemSize): number+=1 work+=1 work-=1 print("%12d%15d"%(problemSize,number)) problemSize*=2
最后得到的结果是:
1000 1000000 2000 4000000 4000 16000000 8000 64000000 16000 256000000
从结果当中可以看出迭代的次数是问题规模的平方
3.度量算法所使用的内存
这样的算法也是可以用于度量算法的性能的,我们将会后面的章节进行解说。