【Python】タイマーの使い方を初心者向けにわかりやすく解説

はじめに

Pythonでは、プログラムを一定時間停止させたり、定期的にタスクを実行させたりする場面が出てくることがあります。
いわゆるタイマーが必要になるケースです。

たとえば、定期的に取得したデータを処理するスクリプトを組んだり、簡単なアプリでアラームを実装したりする場合には、時間を管理する仕組みが重要になってきます。

ここでは、そういったPythonタイマーの基本的な実装から使い方のコツまで、初心者にもわかりやすい表現で解説します。
実際の業務でも応用できるような観点を意識しながら、複数の方法を見ていきましょう。

この記事を読むとわかること

  • Pythonで時間を扱うときの基本的な考え方
  • timeやdatetimeモジュールを用いたタイマーの実装例
  • 定期実行をしたい場合のthreading.Timerやschedモジュールの利用例
  • 実務で役立つ活用シーンと具体的な注意点

これらを順番に学ぶことで、シンプルなスクリプトから日常的な業務スクリプトまで、応用しやすいタイマーの使い方を把握できます。

タイマーを使う場面はどんなとき?

タイマーを使う場面は、プログラミングにおいて意外と多いかもしれません。
以下のような状況が挙げられます。

まず、定期的にデータを取得するシステムを作るときにタイマーを使うことがあります。
たとえば、数分おきにセンサー値を取得してファイルに書き込みたい場合です。
このときは、ある一定の間隔で関数を呼び出し続ける仕組みが役立ちます。

また、処理の実行時間を測定し、パフォーマンスの目安を知りたいこともあるでしょう。
アルゴリズムの速度を調べるときには、コードの実行前後で時間を記録する方法がよく使われます。
このような計測を行う際にも、タイマーの知識がベースになります。

さらに、簡易的なアラーム機能を作りたい場合にも、タイマーや定期実行の仕組みは欠かせません。
一定時間後に特定の処理を走らせるだけで、ちょっとした通知アプリのような機能を実現できます。
実務でも、小規模な自動化タスクの作成時に便利です。

このように、タイマー機能はデータ取得から実行時間計測、通知まで幅広く利用できます。
それでは、Pythonで時間を扱うための基本から順番に見ていきましょう。

Pythonで時間を扱うための基本

Pythonには、時間を操作したり取得するためのモジュールが用意されています。
代表的なものはtimeモジュールdatetimeモジュールです。

timeモジュール

timeモジュールでは、シンプルに今の時刻を取得したり、実行を停止させるメソッドを使用できます。
よく使われるものとして、以下のようなものがあります。

time.time()

現在の時刻をUNIX時間(1970年1月1日 0時0分0秒からの経過秒数)で取得します。

time.sleep (秒数)

指定した秒数のあいだ処理を一時停止します。

このモジュールで簡単に実現できるのは、一定時間待ってから次の処理をするという待機機能です。
一時的にプログラムを止めたいシーンでは必ずといっていいほど利用されます。

datetimeモジュール

datetimeモジュールは、より細かい日付や時刻の扱いが必要なときに便利です。
datetime.datetimedatetime.timedelta を使うことで、日時の演算がしやすくなります。
たとえば「今から2時間後」や「今日から3日後」などの日付計算が簡単に表現できます。

タイマーと直接的に連携するケースはtimeモジュールほど多くはありませんが、実務では記録を取る際に日時を扱うことが多いです。
このモジュールを上手に組み合わせると、ログにタイムスタンプを残したり、指定した日時に処理を開始したりといったことを実装しやすくなるでしょう。

シンプルなタイマー実装例

ここでは、基本的な待機を実現するタイマーのコード例を紹介します。
たとえば、「5秒待ってからメッセージを表示する」という処理を考えてみます。

import time

print("処理開始...")

# 5秒待機
time.sleep(5)

print("5秒経過しました。次の処理を実行します。")

上記のように、time.sleep(5) を使うだけで簡単なタイマー機能を実装できます。
この方法は、プログラム全体を停止させる という点が特徴なので、待機中に他の処理をしたい場合は向いていません。

たとえば、ゲームのように定期更新しながら他の処理を行う場合には、sleep とは別の仕組みを使うか、マルチスレッドを検討する必要があります。
しかし、シンプルな「数秒後に何かをしたいだけ」の用途には十分です。

Pythonで待機を入れるときは、このようにtime.sleepを使うのが最も簡単といえます。

実務においても、Webスクレイピングなどで一定時間ごとにリクエストを送る場合などに、sleepはわかりやすい方法となるでしょう。
ただし複数のタスクを同時に動かしたいときは別の手法を考える必要があります。

タスクの定期実行をする方法

一定時間後や一定時間ごとに特定の関数を呼び出したいとき、threading.Timersched モジュールが役立ちます。
これらを使うと、プログラム全体を止めずに定期タスクをセットアップしやすくなります。

threading.Timerを使った方法

threading.Timerは、指定した秒数が経過したあとに、あらかじめ登録しておいた関数を呼び出します。
簡単な例を示します。

import threading
import time

def greet():
    print("一定時間後に実行されるメッセージです。")

# 3秒後にgreet関数を実行
timer = threading.Timer(3, greet)
timer.start()

print("タイマーをセットしました。")
time.sleep(5)
print("メインの処理は終了です。")

このコードでは、threading.Timer(3, greet) とすることで、3秒後に greet() 関数が実行されます。
定期的な実行をしたい場合は、タイマーを再度起動するロジックを関数の内部に書くなどの工夫が必要になります。

schedモジュールでの実装

同様の機能を、schedモジュール で実現することも可能です。
schedを使うと、イベントを追加していく形でタスクをスケジュールできるので、複数のイベント管理がしやすくなるでしょう。
ただし、基本的な構造はthreading.Timerより少し複雑になります。

import sched
import time

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

def task():
    print("タスクが実行されました。")

# 5秒後にtaskを実行する
scheduler.enter(5, 1, task)

print("イベントをスケジューリングしました。")
scheduler.run()
print("スケジューラーの実行が完了しました。")

scheduler.enter(5, 1, task) で 5秒後に task() を呼び出す指定を行い、最後の scheduler.run() でスケジューラをスタートします。
このやり方は、複数のイベントを柔軟に並べるときに効果的です。

経過時間を測定するには?

タイマーは、単に「待つ」ためだけでなく、コードの実行時間を測るときにも重宝します。
Pythonには、実行時間を計測するための関数がいくつかあります。

time.time() での計測

最もシンプルな方法は、コードの開始前と終了後で time.time() を呼び出し、差を取る方法です。

import time

start = time.time()

# 計測したい処理
sum_value = 0
for i in range(1000000):
    sum_value += i

end = time.time()
print("経過時間:", end - start, "秒")

この方法なら、単純に何秒かかったのかを把握できます。
規模がそこまで大きくない処理を計測するのに向いています。

time.perf_counter() の活用

より正確な計測をしたい場合には、time.perf_counter() を使うと良いとされています。
この関数は、システムがスリープするなど外部要因の影響を受けにくい形で、精密に経過時間を測定します。

import time

start = time.perf_counter()

# 計測したい処理
sum_value = sum(range(1000000))

end = time.perf_counter()
print("perf_counterを使った経過時間:", end - start, "秒")

大きな負荷がかかる処理や、コンピュータ環境の影響を少しでも減らしたいときには、こちらを選ぶとよいでしょう。

時間の精度と注意点

タイマーを扱うときに気をつけたいのは、実行環境によって若干のズレが生じる ことです。
たとえば time.sleep(1) と書いても、処理内容やOSのスケジューリングの影響で、完全に1秒ぴったりになるとは限りません。

また、コードの規模が大きくなるほど、どこかで実行が遅れたり割り込みが入ったりする可能性があります。
このように、タイマーや計測が誤差を含むということを意識し、柔軟に対処する必要があるでしょう。

すべての環境や状況で、タイマーが正確に動くとは限りません。
絶対的な正確さを要求される分野では、さらに精度の高い仕組みを検討する必要があります。

実務では、ある程度の許容誤差があるならtimeモジュールで問題ありませんが、金融分野やリアルタイムシステムのように厳密さが求められる場合は、より高度な時間管理の仕組みを検討してください。

まとめ

ここまで、Pythonでタイマーを扱うための基本知識と実装方法を紹介してきました。
timeモジュール を使えば簡単な待機機能を実現できますし、threading.Timersched モジュールを活用すると、定期タスクの実行やイベント管理ができます。
また、time.time()time.perf_counter() で処理の実行時間を計測することも可能です。

実務では、待機や定期実行以外にも、スクリプトのパフォーマンス測定やログの記録などで時間管理が必要になる場面があります。
そうしたときに本記事の内容を思い出していただくと、どの方法が適しているかを判断しやすくなるのではないでしょうか。

Pythonのタイマーを使いこなせると、小規模な自動化からアルゴリズムの最適化まで幅広く応用できます。
ぜひ、用途にあわせて複数の方法を使い分けてみてください。

Pythonをマスターしよう

この記事で学んだPythonの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。