一、time模塊的使用
在Python中,可以使用time模塊來測量代碼的性能。具體來說,我們可以使用time.perf_counter()函數來計算程序運行時間。
import time
start_time = time.perf_counter()
# 待測試的代碼
end_time = time.perf_counter()
print("程序運行時間:", end_time - start_time)
time.perf_counter()函數返回的是CPU執行時間,單位是秒。我們分別在代碼開始和結束位置取得時間,並計算時間差,就能得出程序的運行時間。
二、使用timeit模塊進行多次測量
如果我們想測試代碼的性能穩定性,可以多次運行代碼並取平均值。Python中有一個timeit模塊,它可以方便地進行多次性能測試。
import timeit
t = timeit.Timer("待測試的代碼", "import 模塊")
print("程序運行時間:", t.timeit(number=1000)) # 進行1000次測試,並計算平均值
timeit.Timer()函數可以傳入兩個參數,第一個參數是待測試的代碼,第二個參數是需要導入的模塊。我們可以通過設置number參數來指定測試次數。timeit.Timer.timeit()方法會返回經過多次測試後的平均運行時間。
三、性能優化
測量完程序的性能後,我們可以對程序進行優化,以提高程序的運行速度。
最普遍的性能優化方式之一就是減少循環次數。如果存在多層循環,可以將內層循環儘可能提到外層循環外面來減少循環次數。同時,也可以考慮使用一些新的數據結構來替換原有的演算法。
四、實例:計算斐波那契數列
我們以計算斐波那契數列為例來測試代碼性能,並進行優化。
斐波那契數列是一個非常經典的數列,下一項的值是前兩項的和,即:0, 1, 1, 2, 3, 5, 8, 13, 21……
首先,我們看一下最基礎的計算斐波那契數列的代碼:
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(30))
這段代碼的時間複雜度是O(2^n),n越大,計算時間越長。
接下來,我們進行優化。首先,我們將已經計算過的值保存下來,避免重複計算。這樣做可以大大減少循環次數。
memo = {} # 存儲已經計算過的值
def fibonacci(n):
if n <= 1:
return n
if n not in memo:
memo[n] = fibonacci(n-1) + fibonacci(n-2)
return memo[n]
print(fibonacci(30))
下一步,我們考慮循環計算斐波那契數列。在循環中,我們只需存儲前兩個數值並依次更新,就能計算出所有的斐波那契數列。
def fibonacci(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a
print(fibonacci(30))
最後,我們通過time模塊來測試不同演算法的性能,並對比不同演算法的運行時間。
import time
def fibonacci_recursive(n):
if n <= 1:
return n
else:
return fibonacci_recursive(n-1) + fibonacci_recursive(n-2)
def fibonacci_memo(n, memo):
if n <= 1:
return n
if n not in memo:
memo[n] = fibonacci_memo(n-1, memo) + fibonacci_memo(n-2, memo)
return memo[n]
def fibonacci_loop(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a
start_time = time.perf_counter()
print(fibonacci_recursive(35))
end_time = time.perf_counter()
print("遞歸演算法的運行時間:", end_time - start_time)
start_time = time.perf_counter()
print(fibonacci_memo(35, {}))
end_time = time.perf_counter()
print("使用備忘錄的遞歸演算法的運行時間:", end_time - start_time)
start_time = time.perf_counter()
print(fibonacci_loop(100000))
end_time = time.perf_counter()
print("循環演算法的運行時間:", end_time - start_time)
運行結果表明,遞歸演算法的運行時間最長,循環演算法的運行時間最短。使用備忘錄的遞歸演算法與循環演算法的運行時間差距不大。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/196383.html