Python 時間

Vaibhhav Khetarpal 2023年1月30日
  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