我們要想去度量一個算法的性能,有多種方法,比如度量算法的運行時間,統計指令,度量算法所使用的內存等方法,下面我們一個一個的來解讀一下
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.度量算法所使用的內存
這樣的算法也是可以用於度量算法的性能的,我們將會后面的章節進行解說。