有別於先前利用time模組做成裝飾器計算程式執行的時間,Python 標準庫中的timeit
模組是專門用來測量小段程式碼的執行時間。
這篇文章將介紹如何使用 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} 秒")
在這個範例中,我們比較了 list
和 set
的查找效率。結果通常會顯示集合的查找速度遠快於串列,因為集合使用雜湊表(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
都能提供精確的時間測量結果。