【Python】ミリ秒単位で時間計測する方法

Pythonでプログラムの実行時間を計測する方法を知りたいですか?この記事では、Pythonの基本的な時間計測方法から、ミリ秒単位での高精度な計測方法までをわかりやすく解説します。

timeモジュールやdatetimeモジュールを使った基本的な方法から、timeitモジュールやperf_counterを使った高精度な計測方法まで、具体的なコード例を交えて説明します。

さらに、関数やスクリプト全体の実行時間を計測する実践的な方法も紹介します。

これを読めば、Pythonでの時間計測が簡単にできるようになりますよ!

目次から探す

Pythonでの時間計測の基本

Pythonで時間を計測する方法はいくつかあります。

ここでは、基本的な方法としてtimeモジュールとdatetimeモジュールを紹介します。

これらのモジュールを使うことで、簡単に時間を計測することができます。

timeモジュール

timeモジュールは、Pythonで時間に関する操作を行うための標準ライブラリです。

このモジュールには、時間を計測するためのいくつかの関数が含まれています。

time.time()

time.time()は、現在の時刻をエポック(1970年1月1日 00:00:00 UTC)からの秒数で返します。

この関数は、システムクロックに依存しており、ミリ秒単位の精度を持っています。

import time
start_time = time.time()
# ここに計測したい処理を書く
end_time = time.time()
elapsed_time = end_time - start_time
print(f"経過時間: {elapsed_time * 1000} ミリ秒")

上記のコードでは、time.time()を使って処理の開始時刻と終了時刻を取得し、その差を計算することで経過時間を求めています。

結果はミリ秒単位で表示されます。

time.perf_counter()

time.perf_counter()は、高精度な時間計測を行うための関数です。

この関数は、システムの高精度タイマーを使用しており、time.time()よりも精度が高いです。

import time
start_time = time.perf_counter()
# ここに計測したい処理を書く
end_time = time.perf_counter()
elapsed_time = end_time - start_time
print(f"経過時間: {elapsed_time * 1000} ミリ秒")

time.perf_counter()を使用することで、より正確な時間計測が可能になります。

特に、短時間の処理を計測する場合に有効です。

datetimeモジュール

datetimeモジュールは、日付と時刻を操作するための標準ライブラリです。

このモジュールを使うことで、現在の日時を取得したり、日時の差を計算したりすることができます。

datetime.datetime.now()

datetime.datetime.now()は、現在の日時を取得するための関数です。

この関数は、マイクロ秒単位の精度を持っています。

from datetime import datetime
start_time = datetime.now()
# ここに計測したい処理を書く
end_time = datetime.now()
elapsed_time = end_time - start_time
print(f"経過時間: {elapsed_time.total_seconds() * 1000} ミリ秒")

上記のコードでは、datetime.datetime.now()を使って処理の開始時刻と終了時刻を取得し、その差を計算することで経過時間を求めています。

結果はミリ秒単位で表示されます。

datetime.timedelta

datetime.timedeltaは、2つの日時の差を表すためのクラスです。

このクラスを使うことで、日時の差を簡単に計算することができます。

from datetime import datetime, timedelta
start_time = datetime.now()
# ここに計測したい処理を書く
end_time = datetime.now()
elapsed_time = end_time - start_time
print(f"経過時間: {elapsed_time.total_seconds() * 1000} ミリ秒")

datetime.timedeltaを使うことで、日時の差を簡単に計算し、ミリ秒単位で表示することができます。

これにより、時間計測がより直感的に行えるようになります。

以上が、Pythonでの時間計測の基本的な方法です。

次のセクションでは、ミリ秒単位での時間計測についてさらに詳しく解説します。

ミリ秒単位での時間計測

Pythonでは、ミリ秒単位での時間計測を行うためにいくつかの方法があります。

ここでは、timeモジュールとdatetimeモジュールを使用した方法について詳しく解説します。

timeモジュールを使用した方法

time.time()の使用例

timeモジュールのtime.time()関数は、エポック(1970年1月1日 00:00:00 UTC)からの経過時間を秒単位で返します。

この関数を使用してミリ秒単位の時間計測を行うことができます。

import time
# 計測開始
start_time = time.time()
# 計測対象の処理
for i in range(1000000):
    pass
# 計測終了
end_time = time.time()
# 経過時間をミリ秒単位で計算
elapsed_time = (end_time - start_time) * 1000
print(f"経過時間: {elapsed_time} ミリ秒")

このコードでは、time.time()を使用して処理の開始時間と終了時間を取得し、その差をミリ秒単位で計算しています。

time.perf_counter()の使用例

time.perf_counter()は、より高精度な時間計測を行うための関数です。

この関数は、システムの高精度なタイマーを使用して経過時間を計測します。

import time
# 計測開始
start_time = time.perf_counter()
# 計測対象の処理
for i in range(1000000):
    pass
# 計測終了
end_time = time.perf_counter()
# 経過時間をミリ秒単位で計算
elapsed_time = (end_time - start_time) * 1000
print(f"経過時間: {elapsed_time} ミリ秒")

このコードでは、time.perf_counter()を使用して高精度な時間計測を行っています。

time.time()と同様に、開始時間と終了時間の差をミリ秒単位で計算しています。

datetimeモジュールを使用した方法

datetime.datetime.now()の使用例

datetimeモジュールのdatetime.datetime.now()関数を使用して、現在の日時を取得し、ミリ秒単位での時間計測を行うことができます。

from datetime import datetime
# 計測開始
start_time = datetime.now()
# 計測対象の処理
for i in range(1000000):
    pass
# 計測終了
end_time = datetime.now()
# 経過時間をミリ秒単位で計算
elapsed_time = (end_time - start_time).total_seconds() * 1000
print(f"経過時間: {elapsed_time} ミリ秒")

このコードでは、datetime.datetime.now()を使用して処理の開始時間と終了時間を取得し、その差をミリ秒単位で計算しています。

datetime.timedeltaを使った計算

datetime.timedeltaを使用すると、時間の差を簡単に計算することができます。

datetime.timedeltaオブジェクトは、2つのdatetimeオブジェクトの差を表します。

from datetime import datetime, timedelta
# 計測開始
start_time = datetime.now()
# 計測対象の処理
for i in range(1000000):
    pass
# 計測終了
end_time = datetime.now()
# 経過時間を計算
elapsed_time = end_time - start_time
# 経過時間をミリ秒単位で表示
print(f"経過時間: {elapsed_time.total_seconds() * 1000} ミリ秒")

このコードでは、datetime.timedeltaを使用して開始時間と終了時間の差を計算し、その差をミリ秒単位で表示しています。

以上の方法を使用することで、Pythonでミリ秒単位の時間計測を簡単に行うことができます。

用途に応じて、適切な方法を選択してください。

高精度な時間計測

Pythonで高精度な時間計測を行うためには、timeitモジュールとperf_counter関数が非常に有用です。

これらのツールを使うことで、ミリ秒単位での精密な時間計測が可能になります。

timeitモジュール

timeitモジュールは、Pythonの標準ライブラリに含まれており、コードの実行時間を高精度に計測するためのツールです。

特に、短いコードスニペットの実行時間を測定するのに適しています。

timeit.timeit()の使い方

timeit.timeit()関数は、指定したコードを複数回実行し、その平均実行時間を計測します。

以下に基本的な使い方を示します。

import timeit
# 計測したいコードを文字列として指定
code_to_test = """
a = 10
b = 20
c = a + b
"""
# timeit.timeit()を使って実行時間を計測
execution_time = timeit.timeit(code_to_test, number=1000000)
print(f"実行時間: {execution_time}秒")

この例では、code_to_testに指定したコードを100万回実行し、その平均実行時間を計測しています。

timeit.repeat()の使い方

timeit.repeat()関数は、timeit.timeit()と似ていますが、複数回の計測を行い、その結果をリストとして返します。

これにより、実行時間のばらつきを確認することができます。

import timeit
# 計測したいコードを文字列として指定
code_to_test = """
a = 10
b = 20
c = a + b
"""
# timeit.repeat()を使って実行時間を計測
execution_times = timeit.repeat(code_to_test, repeat=5, number=1000000)
print(f"実行時間: {execution_times}")

この例では、code_to_testに指定したコードを5回計測し、それぞれの実行時間をリストとして返します。

perf_counterの詳細

perf_counterは、Pythonのtimeモジュールに含まれている関数で、高精度な時間計測を行うために設計されています。

time.time()と異なり、perf_counterはシステムのクロックの影響を受けにくく、より正確な計測が可能です。

なぜperf_counterが高精度なのか

perf_counterは、システムの高精度タイマーを使用して時間を計測します。

これにより、システムクロックの変更や他のプロセスの影響を受けにくくなっています。

特に、短時間の計測においてその精度が発揮されます。

使用例と注意点

以下に、perf_counterを使った時間計測の例を示します。

import time
import math
# 計測開始
start_time = time.perf_counter()
# 計測したい処理
result = sum(math.sqrt(i) for i in range(1000000))
# 計測終了
end_time = time.perf_counter()
# 実行時間を計算
execution_time = end_time - start_time
print(f"実行時間: {execution_time}秒")

この例では、perf_counterを使って、100万回の平方根計算の実行時間を計測しています。

注意点として、perf_counterはシステム依存のため、異なる環境での計測結果が異なる場合があります。

また、非常に短い時間の計測では、他のプロセスの影響を受けることがあるため、複数回の計測を行い平均を取ることが推奨されます。

実践例

ここでは、実際にPythonでミリ秒単位の時間計測を行う方法を具体的な例を通じて解説します。

関数の実行時間を計測する方法と、スクリプト全体の実行時間を計測する方法について見ていきましょう。

関数の実行時間を計測する

関数の実行時間を計測する方法として、デコレータとコンテキストマネージャを使用する方法があります。

デコレータを使った計測

デコレータを使うと、関数の実行時間を簡単に計測できます。

以下は、デコレータを使って関数の実行時間を計測する例です。

import time
def time_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()  # 計測開始
        result = func(*args, **kwargs)
        end_time = time.perf_counter()  # 計測終了
        elapsed_time = (end_time - start_time) * 1000  # ミリ秒に変換
        print(f"{func.__name__}の実行時間: {elapsed_time:.2f} ms")
        return result
    return wrapper
@time_decorator
def example_function():
    time.sleep(1)  # 1秒間スリープ
example_function()

このコードでは、time_decoratorというデコレータを定義し、関数の実行時間を計測しています。

example_functionを実行すると、実行時間がミリ秒単位で表示されます。

コンテキストマネージャを使った計測

コンテキストマネージャを使うと、特定のコードブロックの実行時間を計測できます。

以下は、コンテキストマネージャを使って実行時間を計測する例です。

import time
from contextlib import contextmanager
@contextmanager
def time_context():
    start_time = time.perf_counter()  # 計測開始
    yield
    end_time = time.perf_counter()  # 計測終了
    elapsed_time = (end_time - start_time) * 1000  # ミリ秒に変換
    print(f"コードブロックの実行時間: {elapsed_time:.2f} ms")
with time_context():
    time.sleep(1)  # 1秒間スリープ

このコードでは、time_contextというコンテキストマネージャを定義し、特定のコードブロックの実行時間を計測しています。

with文内のコードが実行されると、実行時間がミリ秒単位で表示されます。

スクリプト全体の実行時間を計測する

スクリプト全体の実行時間を計測する方法として、スクリプトの開始と終了時間を記録する方法と、ログファイルに記録する方法があります。

スクリプトの開始と終了時間を記録

スクリプト全体の実行時間を計測するには、スクリプトの開始と終了時間を記録します。

以下は、その例です。

import time
start_time = time.perf_counter()  # 計測開始
# スクリプトの処理
time.sleep(2)  # 2秒間スリープ
end_time = time.perf_counter()  # 計測終了
elapsed_time = (end_time - start_time) * 1000  # ミリ秒に変換
print(f"スクリプト全体の実行時間: {elapsed_time:.2f} ms")

このコードでは、スクリプトの開始と終了時間を記録し、実行時間をミリ秒単位で表示しています。

ログファイルに記録する方法

実行時間をログファイルに記録することで、後から確認することができます。

以下は、その例です。

import time
import logging
# ログファイルの設定
logging.basicConfig(filename='execution_time.log', level=logging.INFO)
start_time = time.perf_counter()  # 計測開始
# スクリプトの処理
time.sleep(2)  # 2秒間スリープ
end_time = time.perf_counter()  # 計測終了
elapsed_time = (end_time - start_time) * 1000  # ミリ秒に変換
logging.info(f"スクリプト全体の実行時間: {elapsed_time:.2f} ms")

このコードでは、loggingモジュールを使って実行時間をログファイルに記録しています。

execution_time.logファイルに実行時間がミリ秒単位で記録されます。

以上が、Pythonでミリ秒単位の時間計測を行う方法の実践例です。

デコレータやコンテキストマネージャを使った関数の実行時間計測や、スクリプト全体の実行時間を計測する方法を理解することで、効率的なプログラムのパフォーマンス測定が可能になります。

目次から探す