2024-09-13|閱讀時間 ‧ 約 22 分鐘

[Python]使用 timeit.timeit() 測量 Python 程式執行時間

有別於先前利用time模組做成裝飾器計算程式執行的時間,Python 標準庫中timeit 模組是專門用來測量小段程式碼的執行時間。

[Python][裝飾器]計算函式(CT)處理時間

這篇文章將介紹如何使用 timeit.timeit() 函數,並提供一些範例來展示它的應用。


timeit.timeit() 函數

用來測量一段程式碼的執行時間。它的語法如下:

timeit.timeit(stmt='pass', setup='pass', timer=<default timer>, number=1000000, globals=None)

參數說明

  • stmt: 要測量執行時間的程式碼(以字串表示),預設值為 'pass'
  • setup: 執行程式碼前的初始化設定程式碼(以字串表示),預設為 'pass'
  • timer: 計時器,通常使用系統提供的最佳計時器,無需修改。
  • number: 要執行的次數,預設為 1000000 次。可以調整這個參數來控制測試次數。
  • globals: 允許傳入自訂的全域變數字典。

timeit.timeit() 的返回值

函數返回一個浮點數,表示程式碼執行 number 次的總時間,單位是「秒」。

基本範例

展示如何使用 timeit.timeit() 來測量一段程式碼的執行時間。


測量函式的執行時間

import timeit

def test():
L = [i for i in range(100)] # 生成一個列表

# 使用 timeit.timeit 測量 test() 的執行時間
execution_time = timeit.timeit("test()", setup="from __main__ import test", number=100000)
print(f"執行時間: {execution_time} 秒")

在這個範例中,我們測量了 test() 執行 100000 次所需的時間。setup 參數用來導入 test() 函數,這樣我們可以在 stmt 參數中直接調用它。


較不同的列表生成方式

比較兩種生成列表的方式,分別是使用列表推導式和 list() 函數:

import timeit

# 使用列表推導式生成列表
time1 = timeit.timeit("[i for i in range(1000)]", number=10000)
print(f"列表推導式: {time1} 秒")

# 使用 list()range() 生成列表
time2 = timeit.timeit("list(range(1000))", number=10000)
print(f"list(range()): {time2} 秒")

分別測量了兩種不同列表生成方法的時間。從結果中可以比較出哪一種方法執行得更快。


比較串列與集合的搜尋效率

在 Python 中,搜尋元素時,串列和集合的效能是不同的。

我們來測量這兩者的搜尋效率:

import timeit

# 測量串列的搜尋效率
list_time = timeit.timeit(stmt="999 in L", setup="L = list(range(1000))", number=100000)
print(f"串列搜尋時間: {list_time} 秒")

# 測量集合的查找效率
set_time = timeit.timeit(stmt="999 in S", setup="S = set(range(1000))", number=100000)
print(f"集合搜尋時間: {set_time} 秒")

在這個範例中,我們比較了 listset 的查找效率。結果通常會顯示集合的查找速度遠快於串列,因為集合使用雜湊表(hash table)進行查找。

比較字串的串接兩種方式

串接大量字串時,使用 + 來逐步串接字串效能較差。這裡我們將比較兩種方式的字串串接時間:

import timeit

# 使用 + 來串接字串
def concat_strings():
s = ""
for word in ["hello", "world"] * 1000:
s += word

concat_time = timeit.timeit('concat_strings()', setup='from __main__ import concat_strings', number=10000)
print(f"使用 + 拼接字串: {concat_time} 秒")

# 使用 join() 來串接字串
join_time = timeit.timeit('s = "".join(["hello", "world"] * 1000)', number=10000)
print(f"使用 join() 拼接字串: {join_time} 秒")

比較不同的排序算法

我們可以使用 timeit 來比較不同的演算法的效能。

例如,這裡比較了 Python 內建的 sorted() 函數和手動實現的冒泡排序:

import timeit

# 冒泡排序實現
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]

# 測試數據
data = list(range(1000, 0, -1))

# 測量 Python 內建排序的時間
sorted_time = timeit.timeit("sorted(data)", setup="from __main__ import data", number=100)
print(f"內建 sorted() 排序時間: {sorted_time} 秒")

# 測量冒泡排序的時間
bubble_time = timeit.timeit("bubble_sort(data[:])", setup="from __main__ import bubble_sort, data", number=100)
print(f"冒泡排序時間: {bubble_time} 秒")

結論

通過這些範例,你可以看到如何使用 timeit.timeit() 來測量不同程式碼的執行時間,並進行性能比較。

timeit 是一個非常強大的工具,無論你是要優化算法、比較不同實現方式,還是想簡單地測量程式的執行效率,timeit 都能提供精確的時間測量結果。

參考文獻


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.