PYTHON MEBY

Pythonでタイマー処理 (timeit, sched)

この記事では、Pythonでタイマー処理を行うための2つの主要な方法、timeitモジュールとschedモジュールについて解説します。それぞれのモジュールの使用方法、長所と短所を理解することで、適切なタイマー処理を選択できるようになります。

目次

timeitモジュール:コードの実行時間の計測

timeitモジュールは、Pythonコードの実行時間を計測するために設計されています。短いコードスニペットの実行時間を正確に測定するのに非常に便利です。

import timeit

# 計測したいコード
code_to_test = "\n".join(["import random", "random.random()"])

# 実行時間を計測
execution_time = timeit.timeit(stmt=code_to_test, number=100000)  # numberは実行回数

print(f"コードの実行時間: {execution_time:.6f} 秒")

timeit.timeit()関数は、stmt引数に計測したいコード、number引数に実行回数を指定します。返り値は、コードの実行時間の合計です。

より詳細な計測には、timeit.repeat()関数を使用できます。これは、計測を複数回繰り返し、平均実行時間や標準偏差を算出するのに役立ちます。

import timeit

code_to_test = "\n".join(["import random", "random.random()"])

# 計測を3回繰り返し、平均実行時間と標準偏差を求める
times = timeit.repeat(stmt=code_to_test, number=100000, repeat=3)

print(f"実行時間(3回): {times}")
print(f"平均実行時間: {sum(times) / len(times):.6f} 秒")

repeat関数の返り値は、各実行の時間を含むリストです。

schedモジュール:タスクのスケジュールと実行

schedモジュールは、特定の時間にタスクを実行したり、定期的にタスクを実行したりするのに使用します。

import sched
import time

# schedulerオブジェクトを作成
scheduler = sched.scheduler(time.time, time.sleep)

# 実行する関数
def task(name):
    print(f"{name}を実行中... ({time.ctime()})")

# タスクをスケジュール
scheduler.enterabs(time.time() + 5, 1, task, argument=('タスクA',))
# 10秒後にタスクBを実行
scheduler.enterabs(time.time() + 10, 1, task, argument=('タスクB',))

# スケジュールされたタスクを実行
scheduler.run()

enterabs()関数は、絶対時間を指定してタスクをスケジュールします。time.time()は現在の時間を取得し、それに秒数を足して絶対時間を指定しています。引数には、実行時間を秒単位で、タスクを実行する関数を、引数をタプルで渡します。

enter()関数は、相対時間を指定してタスクをスケジュールできます。

import sched
import time

scheduler = sched.scheduler(time.time, time.sleep)

def task(name):
    print(f"{name}を実行中... ({time.ctime()})")

# 5秒後にタスクCを実行
scheduler.enter(5, 1, task, argument=('タスクC',))

scheduler.run()

schedモジュールは、より複雑なタイマー処理が必要な場合に適しています。

timeitとschedの使い分け

timeitモジュールは、コードの実行時間を正確に計測するためのツールです。一方、schedモジュールは、タスクをスケジュールして実行するためのツールです。どちらのモジュールを使用するかは、目的によります。

  • コードの実行時間を計測したい場合はtimeitモジュールを使用する
  • 特定の時間にタスクを実行したい場合、または定期的にタスクを実行したい場合はschedモジュールを使用する

関連記事