Python 時間

Vaibhhav Khetarpal 2023年1月30日 2022年5月18日
  1. timeit 的優點:
  2. 使用 timeit 模組比較兩個片段的執行時間
  3. 使用 timeit 模組的命令列介面
Python 時間

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 searchLinear 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 Khetarpal avatar Vaibhhav Khetarpal avatar

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