WHAT'S UP?

New post every sometimes. Here's OKKAH NET.

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


結果をグラフにすると以下のようになります。
f:id:okkah:20170511113923p:plain


やはり、リスト内包表記+三項演算子が圧倒的に速いですね。特にユーザCPU時間は他のプログラムと比べて2倍以上速いという結果がでました。



短い行数で記述し、かつ実行速度を上げたい場合には、リスト内包表記が便利。ただし可読性を失わない程度に。