python 程式碼執行時間獲取方式

2020-09-16 13:00:28

我們知道為了提高程式碼的執行速度,我們需要對書寫的python程式碼進行效能測試,而程式碼效能的高低的直接反饋是電腦執行程式碼所需要的時間。這裡將介紹四種常用的測試程式碼執行速度的方法。
第一種:使用time模組對程式碼的執行時間進行統計,程式碼如下:

import time


class Debug:
    def mainProgram(self):
        start_time = time.time()
        for i in range(100):
            print(i)
        end_time = time.time()
        print(f"the running time is: {end_time - start_time} s")
        

if __name__ == "__main__":
    main = Debug()
    main.mainProgram()

我們採用time 模組給所要測試的程式碼的前後加上時間戳,一個記為start_time,一個記作end_time,最後程式碼塊的執行時間為end_time-start_time。當然在python中還有許多的記錄時間的模組,這裡不做過多討論,均類似於time模組,實現思路上一致,程式碼實現上大同小異。
第二種:使用IPythonBuilt-in magic commands,%time,程式碼如下:

class Debug:
    def mainProgram(self):
        %time for i in range(100): print(i)
        

main = Debug()
main.mainProgram()
"""
Wall time: 1.99 ms
"""

這個類定義是可以去掉的,並不會影響最終的結果,%time 後面加上想要計算時間的程式碼,然後編譯器就會在執行後自動給出所測試程式碼的執行時間,但是經過測試,%time方法測出的時間並不準確,時間波動範圍非常大,這個是很好理解的,因為計算機每時每刻都在處理一些程序,也就是說計算機的執行狀態每時每刻都是不同的,所以在不同的時刻測試同一段程式碼的執行時間也會得到不同的結果。
第三種:用IPython的另一個Built-in magic commands,%timeit,使用方法類似於%time,程式碼如下:

class Debug:
    def mainProgram(self):
        %timeit for i in range(100): print(i)
        

main = Debug()
main.mainProgram()
"""
8.53 ms ± 452 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
"""

我們可以看到得到的結果是:每個迴圈8.53 ms±452 µs(平均±標準偏差,共執行7次,每個迴圈100個)%timeit相比於%time%timeit會多次執行測試程式碼,並且會取它們執行時間的平均值,並且還會計算出它們的標準差,因此這種計算方法計算的結果相對與使用%time執行測試程式碼一次是比較準確的。
第四種:匯入timeit模組來計算程式碼塊的執行時間

import timeit


class Debug:
    def mainProgram(self):
        result = timeit.timeit(stmt="for i in range(100): print(i)", number=10)
        print(result)


main = Debug()
main.mainProgram()
"""
0.05363089999991644 s
"""

匯入timeit模組後使用timeit.timeit()來測試想要測試的程式碼,並且程式碼以string的形式進行輸入,並且需要設定number值,設定測試的該段程式碼需要執行的次數,最終我們得到0.05363089999991644,單位是s,與內建魔法方法%timeit方法不同的是雖然也是多次計算,但是最終獲取的時間是n次執行程式碼所需的總時間而不是執行一次的時間。
至此,程式碼的執行速度測試方法的介紹暫時告一段落。(以後可能會進一步更新更加全面的)