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モジュールを使用する
関連記事
- Pythonで現在の日付・時刻を取得(datetime.datetime.now, datetime.date.today)
- Pythonで特定の日付・時刻を作成(datetime.datetime, datetime.date, datetime.time)
- Pythonで日付・時刻の加算・減算(timedelta)
- Pythonで日付・時刻のフォーマット変換(strftime, strptime)
- PythonでUNIXタイムスタンプと日付・時刻を相互に変換(timestamp, fromtimestamp)
- Pythonでタイムゾーンを設定(pytz, zoneinfo (Python 3.9以降))
- Pythonでスレッドを使う(threading)
- Pythonでプロセスを使う(multiprocessing)
- Pythonでスレッドプール・プロセスプールを使う(concurrent.futures)
- Pythonで非同期処理を使う(asyncio, Python 3.5以降)