Python - 效能測量



一個給定的問題可能可以透過多種不同的演算法來解決。因此,我們需要最佳化解決方案的效能。Python 的 timeit 模組是一個用於測量 Python 應用程式效能的有用工具。

此模組中的 timit() 函式測量 Python 程式碼的執行時間。

語法

timeit.timeit(stmt, setup, timer, number)

引數

  • stmt − 用於效能測量的程式碼片段。

  • setup − 要傳遞的引數或變數的設定詳細資訊。

  • timer − 使用預設計時器,因此可以跳過。

  • number − 程式碼將執行此次數。預設為 1000000。

示例

以下語句使用列表推導式為從 0 到 100 的每個數字返回其 2 倍的列表。

>>> [n*2 for n in range(100)]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34,
36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68,
70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100,
102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126,
128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152,
154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178,
180, 182, 184, 186, 188, 190, 192, 194, 196, 198]

為了測量上述語句的執行時間,我們使用 timeit() 函式,如下所示:

>>> from timeit import timeit
>>> timeit('[n*2 for n in range(100)]', number=10000)
0.0862189000035869

將執行時間與使用 for 迴圈追加數字的過程進行比較。

>>> string = '''
... numbers=[]
... for n in range(100):
... numbers.append(n*2)
... '''
>>> timeit(string, number=10000)
0.1010853999905521

結果表明列表推導式效率更高。

語句字串可以包含一個 Python 函式,可以將一個或多個引數作為設定程式碼傳遞給該函式。

我們將找到並比較使用迴圈的階乘函式與其遞迴版本的執行時間。

使用 for 迴圈的普通函式為:

def fact(x):
   fact = 1
   for i in range(1, x+1):
      fact*=i
   return fact

遞迴階乘的定義。

def rfact(x):
   if x==1:
      return 1
   else:
      return x*fact(x-1)

測試這些函式以計算 10 的階乘。

print ("Using loop:",fact(10))
print ("Using Recursion",rfact(10))
Result
Using loop: 3628800
Using Recursion 3628800

現在我們將使用 timeit() 函式找到它們各自的執行時間。

import timeit

setup1="""
from __main__ import fact
x = 10
"""

setup2="""
from __main__ import rfact
x = 10
"""

print ("Performance of factorial function with loop")
print(timeit.timeit(stmt = "fact(x)", setup=setup1, number=10000))

print ("Performance of factorial function with Recursion")
print(timeit.timeit(stmt = "rfact(x)", setup=setup2, number=10000))

輸出

Performance of factorial function with loop
0.00330029999895487
Performance of factorial function with Recursion
0.006506800003990065

遞迴函式比帶迴圈的函式慢。

透過這種方式,我們可以執行 Python 程式碼的效能測量。

廣告