timeモジュール
前回、Pythonでtimeモジュールを使ってプログラムの処理時間を正確に計測する方法を紹介しました。
今回はtimeモジュールを使って一定時間ごとに繰り返し処理する方法を紹介します。
一定時間ごとに処理を行う場合、「time.sleep」を使って一定時間処理を止めるという方法を使うことも多いでしょう。
import time
starttime = time.perf_counter()
for i in range(10):
time1 = time.perf_counter()
print(time1 - starttime)
b = []
for a in range(1000000):
b.append(a)
time.sleep(1)
実行結果
0.00010649600881151855
1.1678818729997147
2.339693093992537
3.50897075899411
4.761249277013121
5.899645132012665
7.047144746989943
8.190570959995966
9.334192670998164
10.486720563989365
しかしこの方法では1回のループでかかる時間は「プログラムの処理時間+time.sleepで指定した時間」となるため、1回のループでの処理時間はまちまちになってしまいます。
ということで今回は1回のループでかかる時間を一定にする方法を2つ紹介します。
それでは始めていきましょう。
停止時間を計算する方法
まず1つ目はループ毎で停止時間を計算し、その時間だけ処理を停止するという方法です。
この場合、ループの始めに「time.perf_counter()」で時間を取得し、ループ内の処理が終わった後で、再度「time.perf_counter()」で時間を取得し、処理の停止時間を計算します。
ということでこんな感じです。
import time
starttime = time.perf_counter()
for i in range(10):
time1 = time.perf_counter()
print(time1 - starttime)
b = []
for a in range(1000000):
b.append(a)
sleeptime = 1 - (time.perf_counter() - time1)
time.sleep(sleeptime)
実行結果
0.0002319140185136348
1.0053000830230303
2.0104029870126396
3.012636267027119
4.017351497022901
5.017613831005292
6.018361010006629
7.021856767009012
8.02246355402167
9.026804585009813
これで小数点第一位までは「0」で揃えることができました。
whileを使う方法
2つ目は「while…break」を使う方法です。
先ほど同様ループの最初に「time.perf_counter()」で時間を取得します。
そしてループの処理の最後に「while文」を使って目的の経過時間になるまでループを回し、経過時間になったら「break」でループを抜けます。
ということでこんな感じです。
import time
starttime = time.perf_counter()
for i in range(10):
time1 = time.perf_counter()
print(time1 - starttime)
b = []
for a in range(1000000):
b.append(a)
while True:
time2 = time.perf_counter()
if time2 - time1 > 1:
break
実行結果
0.00016692699864506721
1.0001677660038695
2.000168689992279
3.0001859629992396
4.000186923018191
5.000187880999874
6.000188850011909
7.000189892016351
8.000190794002265
9.000191772007383
この方法だと小数点第三位まで0で揃えることができました。
どこまで高精度な処理が必要か、またどれだけマシンパワーを使えるかによって使い分けるといいと思います。
次回はmatplotlibでannotateで矢印と注釈(アノテーション)をグラフに表示する方法を紹介します。
ではでは今回はこんな感じで。
コメント