Python timeit

Vaibhhav Khetarpal 2023年1月30日
  1. timeit の利点:
  2. timeit モジュールを使用して、2つのスニペットの実行時間を比較する
  3. timeit モジュールのコマンドラインインターフェイスを使用する
Python timeit

timeit モジュールは、Python コードの実行をプロファイルするすべてのカテゴリツールの中で最も簡単で簡単に実装できるモジュールの 1つです。チュートリアルでは、Python での timeit モジュールの使用と実装について説明します。

Python には、Python コードの小さなスニペットの実行時間を計算できる組み込みライブラリ timeit が含まれています。このモジュールは、指定された Python コードを何百万回も実行することで機能し、考えられるすべての結果から、そのコードの実行中に経過した最小時間を予測します。

timeit の利点:

  • 正確で効率的な結果を提供します。この関数によってレンダリングされる実行時間の精度は、単純な time モジュールを使用する場合よりも単純に高くなります。
  • 指定されたコードスニペットを 100 万回以上実行します。これにより、実行時に経過した時間のより関連性の高い読み取り値が提供されます。
  • さらに、一般的な呼び出し可能インターフェイスとは別に、コマンドラインインターフェイスが追加されています。これは、理解と適用が簡単です。

次に、timeit モジュールの timeit() 関数の構文に注目してみましょう。

timeit.timeit(stmt, setup, timer, number)

timeit.timeit() 関数は 4つのパラメーターを取ります。これらのパラメーターはすべて、以下の関数を理解しやすくするために簡単に説明されています。

  • stmt:名前が示すように、測定する必要があるのはステートメントです。この場合、デフォルト値は pass です。
  • setupstmt に取り組む前に実行する必要のあるコードを示します。繰り返しになりますが、デフォルトは 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))

上記のプログラムは、秒単位の実行時間として出力を提供します。この実行時間は、指定されたコードスニペットの 100 万回の反復に起因します。

また、セットアップ引数にすべての重要なインポートステートメントを含めることをお勧めします。

timeit モジュールを使用して、2つのスニペットの実行時間を比較する

timeit モジュールは、指定された 2つのコードスニペットの実行時間を比較するためにも使用できます。ここでは、それぞれ二分探索線形探索に使用される 2つの関数を使用して、それらの実行時間を比較します。

次のコードは、timeit モジュールを使用して、2つのスニペットの実行時間を比較します。

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 モジュールのコマンドラインインターフェイスを使用する

コマンドラインインターフェイスで簡単な関数コードとその構文を使用して、一度に 1つずつすべての引数に取り組みましょう。

次のコードは、timeit モジュールのコマンドラインインターフェイスを使用しています。

C:\Windows\System32>python3 -m timeit -s "from math import sqrt" -n 10000 -r 5 'a = sqrt(34532)'

ここでは、記事の最初の例と同じ機能を使用しました。

次に、ここで使用されているすべての引数をコマンドラインインターフェイスについて考えてみましょう。

  • timeittimeit モジュールの存在と使用を指定する単純な位置引数。
  • -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