我们要想去度量一个算法的性能,有多种方法,比如度量算法的运行时间,统计指令,度量算法所使用的内存等方法,下面我们一个一个的来解读一下

1.度量算法的运行时间

度量算法的运行时间的一种方法是,利用计算机自带的一个计时器,来获取一个循环所执行的运行时间,我们通过连续几个循环的执行时间从而找出每一个循环之间数字和时间的关系,比如每一次循环的时间都会以指数级增长等。我们来看看下面的python代码,这一段代码设计了多次循环,并利用计算机本身的时钟进行计时,每一个循环之间的时间关系是怎样的呢?

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
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.度量算法所使用的内存

这样的算法也是可以用于度量算法的性能的,我们将会后面的章节进行解说。

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄