Chapter 08

プログラムの実行時間の計測、プログラムの書き方は色々ある

poclabweb
poclabweb
2022.10.28に更新

Time関数を利用したプログラムの実行時間の測定

色々なプログラムを書いていると、この書き方だとどれくらいの時間がかかるんだろうかというのが気になることが出てきます。
時間に関しては、標準ライブラリーのtimeが使用できる。

import time
time.time()

time.time()を行うと現在のUNIX時間が表示されます。
UNIX時間とは、協定世界時 (UTC) での1970年1月1日午前0時0分0秒(UNIXエポック)から形式的な経過秒数になります。

プログラムが遅いなと感じたら、プログラムの処理時間を見ながら試行錯誤していくことになりますが、計測時間の開始のところと計測したいところの終わりの部分を記載して引き算すると、実行時間が得られる。

start = time.time()

# 計測したいプログラムスタート
a = [x ** 2 for x in range(1000000)]
b = [x ** 2 for x in range(1000000)]
c = [x ** 2 for x in range(1000000)]
d = [x ** 2 for x in range(1000000)]
e = [x ** 2 for x in range(1000000)]
# ここまでを計測する

end = time.time()

total_time = end - start
print(f"time:{total_time:.2f}" + "[s]")

これを実行すると、以下の出力結果になる。

マジックコマンドを利用した時間測定

セル全体の実行時間を計測したいときには、%%timeが使用できる。

google colabolatoryだと%%timeと先頭につけるだけで実行時間が計測できる。

0から10000000までの数字を2乗した数字をListの中に入れることをリスト内包表記と呼ぶ。

%%time
a = [x ** 2 for x in range(10000000)]

for 文でリストに数字を入れる記載法と比較すると、リスト内包表記はコードがすっきりするだけでなく速度面でも有利になっている。

%%time
a = []
for x in range(10000000):
    a.append(x ** 2)

以下の出力結果になる。

全体を測定するときは%%timeで部分的に測定するときは%timeを使う。

%%time
a = [x ** 2 for x in range(1000000)]
b = [x ** 2 for x in range(1000000)]
c = [x ** 2 for x in range(1000000)]
d = [x ** 2 for x in range(1000000)]
e = [x ** 2 for x in range(1000000)]
a = [x ** 2 for x in range(1000000)]
b = [x ** 2 for x in range(1000000)]
c = [x ** 2 for x in range(1000000)]
%time d = [x ** 2 for x in range(1000000)]
e = [x ** 2 for x in range(1000000)]

以下の出力結果になる。

表示されている時間に関するコメント

timeで使われている時間や%timeで表示される時間が微妙に違うのは、それぞれの計測している部分が部分が異なっているためになります。

CPU times: CPU時間
user: ユーザースペースで CPU が利用された時間
sys: カーネルスペースで CPU が利用された時間
total: CPU が利用された時間の合計 (total = user + sys)
Wall time: 全体の実行時間