プログラムを書くときに、その処理時間を気にするのはとても重要なことです。
Pythonのプログラムの中ではtimeモジュール、IPythonやJupyter notebookなどの開発環境ではtimeitマジックを使うことで処理時間を確認することができます。
この記事では、
- timeモジュールの使い方
- timeモジュールを使って処理時間を計測する方法
- timeitマジックの使い方
- コマンドラインで処理時間を計測する方法
に分けて、time/timeitを使った処理時間の計測方法を解説していきます。
※この記事のコードはPython 3.7, Ubuntu 18.04で動作確認しました。
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
timeモジュールとは
timeモジュールは、時間を扱うことができるモジュールです。
timeモジュールと似たモジュールに、datetimeモジュールがあります。時刻を取得するためのモジュールとしてはdatetimeモジュールのほうが有名かもしれませんね。
datetimeモジュールについてはこちらの記事で解説しています。
このtimeモジュールを使って簡単に実行時間を計測することができます。
それでは使い方を見ていきましょう。
システム時刻を取得
システムの時刻を取得するにはtime()を指定します。timeモジュールでは、epochというシステム依存の「時刻の起点」があります。
このepochからの総経過時間をtime関数で取得できます。
引用:https://docs.python.jp/3/library/time.html
import time print(time.time())
実行結果
1540920937.0048075
また、gmtime()を指定することで年月日時分秒の形式でわかりやすく取得することができます。
print(time.gmtime())
実行結果
time.struct_time(tm_year=2018, tm_mon=10, tm_mday=30, tm_hour=17, tm_min=36, tm_sec=15, tm_wday=1, tm_yday=303, tm_isdst=0) # 見やすいように改行をしています。
時刻のフォーマットを指定する
取得した時刻を指定したフォーマットで整形するにはstrftime()とstrptime()を指定します。
now = time.ctime() cnvtime = time.strptime(now) print(time.strftime("%Y/%m/%d %H:%M", cnvtime))
実行結果:
2018/10/31 02:37
strptimeで文字列を日付に変換し、strftime()は日付を指定したフォーマットで文字列に変換しています。
timeモジュールで処理時間を計測する方法
さて、ここからは処理の一部の時間を計測する方法について解説します。ここではtimeモジュールで処理時間を計測していきます。
まずはtimeモジュールを使うために、時間測定をしたいコードが書かれているファイルで、timeモジュールをimportしましょう。
import time
この一行をプログラムの中に書くことで、timeモジュールの機能を使うことが出来るようになります。
time関数では、Pythonでは現在の時刻を取得できます。これを使って、処理の開始と終わりの時刻を記録しておけば実行時間が計測できますね。
こちらのコードを見てみましょう。
# 処理前の時刻 t1 = time.time() # 計測したい処理 for i in range(1000000): i ** 10 # 処理後の時刻 t2 = time.time() # 経過時間を表示 elapsed_time = t2-t1 print(f"経過時間:{elapsed_time}")
実行結果
経過時間:0.27019453048706055
単位は秒で、結果が表示されましたね。
ここで、
- t1は処理前の時刻
- t2は処理後の時刻
になります。
これらを使って経過時間(elapsed_time)が計算できました。自分のプログラム中でこれを使うときは、コード中の「# 計測したい処理」の部分を時間計測したいコードに置き換えて実行すればOKです。
ただし簡単で、あまり短すぎる処理時間の場合はうまく計測できない場合があるので、注意しましょう。
timeitマジックの使い方
さて、ここからは実際にtimeitマジックを使って時間を計測していきましょう!マジックという言葉に耳馴染みは無いかもしれませんが、特殊なコマンドの一つだと思ってよいでしょう。
ここではIPython、Jupyter 、またコマンドラインをつかって処理時間を計測していきます。
IPython、Jupyter で時間計測をする方法
最近のPythonコミュニティーでは、
- IPython:標準のPython shellよりも便利な対話シェル
- Jupyter notebook:WebブラウザでPythonの開発ができる開発環境。
- Jupyter lab:notebookの強化版
という便利なツールがよく使われています。
これらの中でコードの実行時間を計測するために、timeモジュールよりももっと便利なtimeitマジックがあります。
timeの解説で使ったコードを、今度はJupyter notebookの上で実行して時間を測ってみましょう。
%%timeit # 計測したい処理 for i in range(1000000): i ** 10
Jupyter notebookの上で、時間計測を行うときは「%%timeit」という記述を頭に書くだけでOKです。
実際に実行した様子は、こちらのgifを確認してみましょう。
後はこのセルを実行すれば簡単に時間が計測できます。このtimeitマジックは、自動的に処理を何度か繰り返して時間を計測してくれます。
今回は一回の処理に時間がかかるものだったので、ループ回数は一回になりました。
ちなみに、最初の行の右側に実行コードが全部収まるのであれば、%は一つだけで「%timeit」と書けばOKです。例として、IPython shellでの実行例を見てみましょう。
In [1]: %timeit [i for i in range(1000)] 22.9 µs ± 35.6 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
こちらでも簡単に時間計測ができますね。
コマンドラインで時間計測をする方法
最後に、コマンドラインでPythonプログラムの実行時間を計測する方法を見ていきましょう。
コマンドラインではこちらのどちらかの書き方で、Pythonのコードの実行時間が測れます。
$python -m timeit "処理内容" $python -m timeit -s "import ファイル名" "ファイル名.関数名"
実行結果
$python -m timeit "arr = [i for i in range(100)]" 100000 loops, best of 3: 3.17 usec per loop
実行結果はJupyter notebookで試したときと同じ形で表示されます。ファイルを作るまでもないけれど、ちょっと試してみたい時に便利かもしれませんね。
次に、自作のモジュールに書いた関数の実行時間を計測する場合です。まずは以下のPythonファイルを用意します。
timeit_test.py:
def func(): arr = [i for i in range(100)]
実行結果
$python -m timeit -s "import timeit_test" "timeit_test.func()" 100000 loops, best of 3: 3.65 usec per loop
オプションの「-s」では最初に1回だけ実行する文を記述して、処理時間を計測するファイル名を入力しています。デフォルトの設定では処理の繰り返し回数は10万回となっています。
これを3回繰り返し最も短い時間がマイクロ秒単位で表示されています。
繰り返し回数ですが関数の引数で指定する場合は100万回、コマンドラインで記述する場合は10万回とデフォルトでの設定値が変わっているので気をつけましょう。
このままPythonを学び続けて大丈夫?
なぜPythonを学ぶのか?
あなたがPythonを学ぶ理由は何でしょうか?
- Pythonが人気だからとりあえず学んでいる
- AIや機械学習の分野に興味があるから
Pythonは初心者向けの言語と言われています。その理由としてシンプルでわかりやすい構文や、実用的なライブラリが豊富なことが挙げられ、実際に学びやすい言語です。
しかし、もしあなたが機械学習に興味があって、とくに知識も無いまま学習を進めると、挫折する可能性が高いと言えます。
機械学習の分野はプログラミング以外にも、専門的な知識や数学の知識も必要になります。ただなんとなく学習していると早い段階でつまづきやすく、そのまま挫折してしまうなんてことも…。
そのため、挫折しないためには、
- 最適な学習環境を用意する
- 必要なライブラリ・ツールを導入する
- わからないことを質問できるメンターを見つける
などが必要になります。
効率よく学びたいなら、無料カウンセリングがおすすめ
まだまだ知りたいことがたくさんある!
もっと詳しくPythonについて知りたい!
といった悩みや願望を持っている方は、弊社「侍エンジニア」をご利用下さい。
侍エンジニアでは、
- 現役エンジニアによるマンツーマンレッスン
- キャリアアドバイザーによる転職・就職支援
- 業界屈指のフリーランス・起業サポート
を受けることができます。
業界屈指のコンサルタントから、効率的な学習方法や仕事獲得術、今後のキャリアまでさまざまな疑問を相談してみませんか?遠方の方でもオンラインで受講できます!お気軽に受講下さい。
侍エンジニア無料カウンセリングを受ける
まとめ
この記事ではtimeモジュール/timeitマジックを使ったPythonコードの処理時間計測の方法を解説しました。自分の書いたコードのパフォーマンス(処理時間)を気にすることは、よりよいコードを書くための第一歩です。
この記事を含めてWebの情報や、書籍を使ってPythonを勉強してつまずいたり、更にPythonを勉強したいなら、侍エンジニアのマンツーマンレッスンをおすすめします。
侍エンジニアではプログラミングを習得したい生徒さん一人ひとりに向けて、オリジナルカリキュラムを作成してレッスンを行っています。
ここで紹介したようなPythonの機能をより体系的に学ぶために、インストラクターと一緒に勉強してみませんか?