Python

【Python】第7章第4回:時間計測とパフォーマンス分析(timeモジュール)

本記事では、Pythonのtimeモジュールを用いた時間計測の方法と、プログラムのパフォーマンス分析について解説します。

0. 記事の概要

この記事を読むメリット

  • 効率的な時間管理:プログラムの実行時間を測定する方法を学べます。
  • パフォーマンス向上:プログラムのボトルネックを見つけ、最適化に役立てるスキルを習得します。
  • Python標準ライブラリの活用:timeモジュールを使いこなせるようになります。

この記事で学べること

  • timeモジュールの基本的な使い方
  • 時間計測とパフォーマンス分析の実例
  • プログラム最適化のアプローチ

1. timeモジュールの概要

1.1 timeモジュールとは?

timeモジュールは、Pythonで時間に関連する操作を行うための標準ライブラリです。主に以下の機能を提供します。

  • 現在時刻の取得:time()ctime()を使用
  • 処理の遅延:sleep()で指定時間の遅延
  • 実行時間の計測:プログラムのパフォーマンス分析に利用可能

1.2 基本的な関数

# timeモジュールの基本例
import time

# 現在の時刻を取得
current_time = time.time()
print(f"現在のタイムスタンプ: {current_time}")

# フォーマットされた時間を表示
formatted_time = time.ctime(current_time)
print(f"フォーマットされた現在時刻: {formatted_time}")

# 3秒間のスリープ
print("3秒待機中...")
time.sleep(3)
print("待機終了")
動作解説
  1. time()で現在時刻のタイムスタンプ(秒)を取得します。
  2. ctime()を使ってタイムスタンプを人間が読みやすい形式に変換します。
  3. sleep()を使って処理を一時停止します。

2. パフォーマンス計測の実例

2.1 実行時間の計測

# 実行時間を計測する例
import time

start_time = time.time()

# サンプル処理(リスト内包表記での計算)
squares = [x**2 for x in range(1, 1000000)]

end_time = time.time()
elapsed_time = end_time - start_time
print(f"処理時間: {elapsed_time:.2f}秒")

2.2 パフォーマンス改善の比較

# リストとジェネレータのパフォーマンス比較
import time

# リスト内包表記
start_time = time.time()
squares_list = [x**2 for x in range(1, 1000000)]
end_time = time.time()
print(f"リスト内包表記の処理時間: {end_time - start_time:.2f}秒")

# ジェネレータ式
start_time = time.time()
squares_gen = (x**2 for x in range(1, 1000000))
for square in squares_gen:
    pass
end_time = time.time()
print(f"ジェネレータの処理時間: {end_time - start_time:.2f}秒")
動作解説
  1. time.time()を使用して処理の開始時刻と終了時刻を記録します。
  2. 計算処理をリスト内包表記とジェネレータ式で実行します。
  3. 両者の実行時間を比較してパフォーマンスを評価します。

3. 応用例:長時間処理の進捗管理

3.1 処理の進捗を表示

# 長時間処理の進捗を表示
import time

for i in range(1, 11):
    print(f"処理中... {i*10}% 完了")
    time.sleep(1)  # 処理の遅延をシミュレート
print("処理が完了しました!")
動作解説
  1. time.sleep()を使って処理の遅延をシミュレートします。
  2. 進捗状況をprint()で表示します。
  3. ループを終了すると処理完了のメッセージが表示されます。

4. 練習問題

以下の課題に挑戦してみましょう。

  1. リスト内の要素をソートする処理の実行時間を計測してください。
  2. time.sleep()を使って一定間隔でメッセージを表示するプログラムを書いてください。
  3. リスト内包表記とループ処理のパフォーマンスを比較してください。

5. 練習問題の解答と解説

問1〜3の解答例

# 問1: ソート処理の実行時間を計測
import time

numbers = [64, 34, 25, 12, 22, 11, 90]
start_time = time.time()
sorted_numbers = sorted(numbers)
end_time = time.time()
print(f"ソート処理時間: {end_time - start_time:.2f}秒")

# 問2: 一定間隔でメッセージを表示
import time

for i in range(5):
    print(f"メッセージ {i+1}")
    time.sleep(2)  # 2秒間隔で表示

# 問3: リスト内包表記とループ処理の比較
import time

# リスト内包表記
start_time = time.time()
squares = [x**2 for x in range(1, 100000)]
end_time = time.time()
print(f"リスト内包表記: {end_time - start_time:.2f}秒")

# ループ処理
start_time = time.time()
squares = []
for x in range(1, 100000):
    squares.append(x**2)
end_time = time.time()
print(f"ループ処理: {end_time - start_time:.2f}秒")

6. まとめ

本記事では、timeモジュールを活用した時間計測とパフォーマンス分析の基本を学びました。これらを使って効率的なプログラム設計を目指しましょう。