PythonでFizzBuzzワンライナー #2
PythonでFizzBuzzワンライナー - OKKAH NETの続きです。
各プログラムの実行速度がどれほど違うのか気になったので比較してみました。
timeコマンドとは
timeコマンドはコマンド・プログラムを引数としており、引数として指定したコマンド・プログラムが実行されるのにどれだけ時間がかかったかを出力するコマンドです。
具体的にsleep 10で試してみましょう。
$ time sleep 10 real 0m10.008s user 0m0.002s sys 0m0.004s
timeが出力する real, user, sys はそれぞれ次のような意味になります。
- real(実時間)
プログラムの呼び出しから終了までにかかった時間(秒) - user(ユーザCPU時間)
プログラム自体の処理時間(秒) - sys(システム時間)
プログラムを処理するために、OSが処理した時間(秒)
よってsleep 10はプログラムの呼び出しから終了までに10.008秒かかったのに対して、sleep 10自体の処理にはCPUがほとんど使われていないことが分かります。
では実際に4つのFizzBuzzプログラムを比較してみましょう。比較しやすいようにFizzBuzzの上限を100から1000000に変えます。
1. for文
$ time python fizzbuzz1.py real 0m5.050s user 0m1.747s sys 0m1.322s
2. while文
$ time python fizzbuzz2.py real 0m5.029s user 0m1.892s sys 0m1.329s
3. 三項演算子
$ time python fizzbuzz3.py real 0m4.894s user 0m1.752s sys 0m1.326s
4. リスト内包表記+三項演算子
$ time python fizzbuzz4.py real 0m4.329s user 0m0.767s sys 0m1.235s
結果をグラフにすると以下のようになります。
やはり、リスト内包表記+三項演算子が圧倒的に速いですね。特にユーザCPU時間は他のプログラムと比べて2倍以上速いという結果がでました。
短い行数で記述し、かつ実行速度を上げたい場合には、リスト内包表記が便利。ただし可読性を失わない程度に。