Python 時間
![Python 時間](/img/Python/ag-feature-image---python-timeit.webp)
timeit
模組是分析 Python 程式碼執行的所有類別工具中最簡單和最容易實現的模組之一。本教程討論了 Python 中 timeit
模組的使用和實現。
Python 包含一個內建庫 timeit
,可以計算 Python 程式碼小片段的執行時間。該模組通過執行給定的 python 程式碼數百萬次來工作,並從所有可能的結果中預測在執行該程式碼期間經過的最少時間。
timeit
的優點:
- 提供精確的有效結果。通過此函式呈現的執行時間的準確性比使用簡單的
time
模組要高。 - 它執行給定的程式碼片段超過一百萬次,這提供了在其執行期間經過的時間的更多相關讀數。
- 除了通用的可呼叫介面外,還增加了命令列介面,易於理解和應用。
繼續,讓我們描述並關注 timeit
模組中 timeit()
函式的語法。
timeit.timeit(stmt, setup, timer, number)
timeit.timeit()
函式有四個引數,為了便於理解下面的函式,已經對所有引數進行了簡要說明:
stmt
:顧名思義,就是需要衡量的語句。在這種情況下,預設值為pass
。setup
:表示在處理stmt
之前必須執行的程式碼。再一次,它的預設值為pass
。timer
:一個基本的timeit.Timer
物件。它已經分配了一個不錯的預設值,通常不需要更改。number
:表示程式設計師想要執行的給定程式碼片段的執行次數。
我們將看到如何實現來自 timeit
模組的 timeit.timeit()
函式的不同示例。
使用 timeit
模組計算簡單程式碼片段的執行時間
此方法在三引號 (''')
之間的變數中定義程式碼片段。
以下程式碼使用 timeit
模組計算簡單程式碼片段的執行時間。
import timeit
setup1 = "from math import sqrt"
code1 = """
def a():
list1 = []
for i in range(50):
list1.append(sqrt(i))
"""
print(timeit.timeit(setup=setup1, stmt=code1, number=10000))
上面的程式以秒為單位提供執行時間的輸出。該執行時間來自給定程式碼片段的一百萬次迭代。
我們還應該注意,在 setup 引數中包含所有必要的 import 語句是很好的。
使用 timeit
模組比較兩個片段的執行時間
timeit
模組還可用於比較兩個給定程式碼片段的執行時間。在這裡,我們將分別用於 Binary search
和 Linear Search
的兩個函式並比較它們的執行時間。
以下程式碼使用 timeit
模組來比較兩個片段的執行時間。
import timeit
# function for binary search
def b_s(mylist, find):
while len(mylist) > 0:
mid = (len(mylist)) // 2
if mylist[mid] == find:
return True
elif mylist[mid] < find:
mylist = mylist[:mid]
else:
mylist = mylist[mid + 1 :]
return False
# function for linear search
def l_s(mylist, find):
for x in mylist:
if x == find:
return True
return False
def b_time():
SETUP_CODE = """
from __main__ import b_s
from random import randint"""
TEST_CODE = """
mylist = [x for x in range(10000)]
find = randint(0, len(mylist))
b_s(mylist, find)"""
times = timeit.repeat(setup=SETUP_CODE, stmt=TEST_CODE, repeat=3, number=10000)
print("Binary search time: {}".format(min(times)))
def l_time():
SETUP_CODE = """
from __main__ import l_s
from random import randint"""
TEST_CODE = """
mylist = [x for x in range(10000)]
find = randint(0, len(mylist))
l_s(mylist, find)
"""
times = timeit.repeat(setup=SETUP_CODE, stmt=TEST_CODE, repeat=3, number=10000)
print("Linear search time: {}".format(min(times)))
if __name__ == "__main__":
l_time()
b_time()
使用 timeit
模組的命令列介面
讓我們在命令列介面中獲取一個簡單的函式程式碼及其語法,並一次處理所有引數。
以下程式碼使用 timeit
模組的命令列介面。
C:\Windows\System32>python3 -m timeit -s "from math import sqrt" -n 10000 -r 5 'a = sqrt(34532)'
在這裡,我們採用了與文章中第一個示例相同的功能。
繼續,讓我們考慮命令列介面中使用的所有引數。
timeit
:一個簡單的位置引數,指定timeit
模組的存在和使用。-s
:設定引數。-n
:數字引數。-r
:重複的引數(可選)。'code snippet'
:程式碼片段直接寫在命令列介面的單引號內。
Vaibhhav is an IT professional who has a strong-hold in Python programming and various projects under his belt. He has an eagerness to discover new things and is a quick learner.
LinkedIn