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

閱讀時間約 1 分鐘

有別於先前利用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} 秒")
raw-image

在這個範例中,我們測量了 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} 秒")

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

raw-image


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

在 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)進行查找。

raw-image

比較字串的串接兩種方式

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

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} 秒")
raw-image

比較不同的排序算法

我們可以使用 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} 秒")
raw-image

結論

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

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

參考文獻


113會員
172Content count
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
re 模組基本介紹 re 模組是 Python 用來處理正則表達式的標準模組。 正則表達式是一種用於描述字串模式的語法,可以用來匹配、搜尋、分割和替換字串中的特定模式。
對於程式卡頓的問題,如何分析程式碼占用多少記憶體,如何釋放或改寫,可以先用python內建的tracemalloc模組來追蹤 Python 分配的記憶體區塊。 本文將介紹最簡單的用法,來分析一段程式碼占用了多少記憶體。 結果呈現 印出當前使用的記憶體,與峰值記憶體使用量。 程式範例 i
在實務上,若Python報錯時,若引入的套件越多伴隨的異常訊息會變得越來越複雜,看到一推密密麻麻的內容時,很多時候都想直接跳過。 本文將利用Traceback來讓異常訊息變得更好理解。
當我們在做很多處理時,結果可能會是List包住一些數值,例如找輪廓或連通域分析時,沒有剛好的特徵可能就會有List含(空值得)形式出現。 為了避免報錯,我們就要額外先做一些處理,先做判斷是否有值在往下一個階段。 all 和 any 是 Python 中用於檢查可迭代物件(如清單、元組、集合等)
在現實生活中,充滿的警報及安全措施,總會設個安全線在那,若觸碰到底線時則會有警報響起。 在Python也有類似的作法,如果希望在某個條件達到時,就拉起警報不要讓程式繼續進行下去,就適合使用raise 這種機制讓開發者能夠在程序執行時檢測到不正確的條件,然後通過引發異常停止程序的執行或通知使用者。
Python 提供了一系列內建函式,其中一部分涉及數學和數學操作。 以下是一些常用的內建函式和數學相關的函式: 基本數學運算: abs(x): 返回 x 的絕對值。 result = abs(-5) print(result) # 輸出: 5 max(iterable) 和 min(
re 模組基本介紹 re 模組是 Python 用來處理正則表達式的標準模組。 正則表達式是一種用於描述字串模式的語法,可以用來匹配、搜尋、分割和替換字串中的特定模式。
對於程式卡頓的問題,如何分析程式碼占用多少記憶體,如何釋放或改寫,可以先用python內建的tracemalloc模組來追蹤 Python 分配的記憶體區塊。 本文將介紹最簡單的用法,來分析一段程式碼占用了多少記憶體。 結果呈現 印出當前使用的記憶體,與峰值記憶體使用量。 程式範例 i
在實務上,若Python報錯時,若引入的套件越多伴隨的異常訊息會變得越來越複雜,看到一推密密麻麻的內容時,很多時候都想直接跳過。 本文將利用Traceback來讓異常訊息變得更好理解。
當我們在做很多處理時,結果可能會是List包住一些數值,例如找輪廓或連通域分析時,沒有剛好的特徵可能就會有List含(空值得)形式出現。 為了避免報錯,我們就要額外先做一些處理,先做判斷是否有值在往下一個階段。 all 和 any 是 Python 中用於檢查可迭代物件(如清單、元組、集合等)
在現實生活中,充滿的警報及安全措施,總會設個安全線在那,若觸碰到底線時則會有警報響起。 在Python也有類似的作法,如果希望在某個條件達到時,就拉起警報不要讓程式繼續進行下去,就適合使用raise 這種機制讓開發者能夠在程序執行時檢測到不正確的條件,然後通過引發異常停止程序的執行或通知使用者。
Python 提供了一系列內建函式,其中一部分涉及數學和數學操作。 以下是一些常用的內建函式和數學相關的函式: 基本數學運算: abs(x): 返回 x 的絕對值。 result = abs(-5) print(result) # 輸出: 5 max(iterable) 和 min(
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
在一次五天的年假中,我決定開始學習Python編程。雖然最初進展順利,但後來發現自己在解題和邏輯方面遇到了困難。經過思考後,我決定轉而學習C/C++,並且制定了一個計畫,希望成為一名後端工程師。這將需要挑戰我的時間管理能力。
Thumbnail
在網頁開發中,時間與日期的處理是重要且基礎的部分,本文將介紹 JavaScript 中的日期的處理方法,並提供範例程式來協助你理解。
Thumbnail
前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
Thumbnail
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
Thumbnail
當你想讓原本函式新增其他功能,又不想更動原本函式時,Python提供了一種強大而靈活的工具,那就是裝飾器。 但對於新手來說這個裝飾器,非常抽象難以理解,讓我們繼續往下看,慢慢的抽絲剝繭吧。 在 Python 中,使用「@」當做裝飾器使用的語法糖符號
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
Thumbnail
本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。
Thumbnail
Python 裝飾器(Decorator),它能夠讓你在不改變原始函式的情況下,增加額外的功能。本文將介紹 Python 裝飾器(Decorator)的基本概念、實現方式,並提供實際應用範例讓你更好了解Python 裝飾器。
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
在一次五天的年假中,我決定開始學習Python編程。雖然最初進展順利,但後來發現自己在解題和邏輯方面遇到了困難。經過思考後,我決定轉而學習C/C++,並且制定了一個計畫,希望成為一名後端工程師。這將需要挑戰我的時間管理能力。
Thumbnail
在網頁開發中,時間與日期的處理是重要且基礎的部分,本文將介紹 JavaScript 中的日期的處理方法,並提供範例程式來協助你理解。
Thumbnail
前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
Thumbnail
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
Thumbnail
當你想讓原本函式新增其他功能,又不想更動原本函式時,Python提供了一種強大而靈活的工具,那就是裝飾器。 但對於新手來說這個裝飾器,非常抽象難以理解,讓我們繼續往下看,慢慢的抽絲剝繭吧。 在 Python 中,使用「@」當做裝飾器使用的語法糖符號
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
Thumbnail
本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。
Thumbnail
Python 裝飾器(Decorator),它能夠讓你在不改變原始函式的情況下,增加額外的功能。本文將介紹 Python 裝飾器(Decorator)的基本概念、實現方式,並提供實際應用範例讓你更好了解Python 裝飾器。