zoukankan      html  css  js  c++  java
  • 评估算法的性能

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

    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.度量算法所使用的内存

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

  • 相关阅读:
    Using Resource File on DotNet
    C++/CLI VS CSharp
    JIT VS NGen
    [Tip: disable vc intellisense]VS2008 VC Intelisense issue
    UVa 10891 Game of Sum(经典博弈区间DP)
    UVa 10723 Cyborg Genes(LCS变种)
    UVa 607 Scheduling Lectures(简单DP)
    UVa 10401 Injured Queen Problem(简单DP)
    UVa 10313 Pay the Price(类似数字分解DP)
    UVa 10635 Prince and Princess(LCS N*logN)
  • 原文地址:https://www.cnblogs.com/geeksongs/p/11278702.html
Copyright © 2011-2022 走看看