【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("待機終了")
動作解説
time()
で現在時刻のタイムスタンプ(秒)を取得します。ctime()
を使ってタイムスタンプを人間が読みやすい形式に変換します。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}秒")
動作解説
time.time()
を使用して処理の開始時刻と終了時刻を記録します。- 計算処理をリスト内包表記とジェネレータ式で実行します。
- 両者の実行時間を比較してパフォーマンスを評価します。
3. 応用例:長時間処理の進捗管理
3.1 処理の進捗を表示
# 長時間処理の進捗を表示
import time
for i in range(1, 11):
print(f"処理中... {i*10}% 完了")
time.sleep(1) # 処理の遅延をシミュレート
print("処理が完了しました!")
動作解説
time.sleep()
を使って処理の遅延をシミュレートします。- 進捗状況を
print()
で表示します。 - ループを終了すると処理完了のメッセージが表示されます。
4. 練習問題
以下の課題に挑戦してみましょう。
- リスト内の要素をソートする処理の実行時間を計測してください。
time.sleep()
を使って一定間隔でメッセージを表示するプログラムを書いてください。- リスト内包表記とループ処理のパフォーマンスを比較してください。
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
モジュールを活用した時間計測とパフォーマンス分析の基本を学びました。これらを使って効率的なプログラム設計を目指しましょう。