PHP再発見

森川です。

モンテカルロ法でπの計算を行うブログを見つけたので、それに触発されてそのスクリプトをPythonとRubyで書いてみました。

PHP


<?php
$iteration = 100000; 
$precision= 1000000;
for ($i = 0; $i < $iteration; $i++) { 
  $x = mt_rand( 0, 2 * $precision ) / $precision - 1; 
  $y = mt_rand( 0, 2 * $precision ) / $precision - 1; 
  if ((($x * $x) + ($y * $y)) < 1 ) {   
    $hits++;
  }  
}

Python


from random import *
iteration = 100000
i = 0
hits = 0
seed() 
while i < iteration: 
  i = i + 1
  x = random()
  y = random()
  if (((x * x) + (y * y)) < 1) :
    hits = hits + 1
print "PI is about", (float)(4 * hits) / (float)(iteration), "<br>\n"

Ruby


iteration = 100000
i = 0
hits = 0
while i < iteration
  i = i + 1
  x = rand()
  y = rand()
  if (((x * x) + (y * y)) < 1) :
    hits = hits + 1
  end
end
print "PI is about", (4*hits).quo(iteration) , "<br>\n"

このスクリプト自体は全然難しくないので、すぐにPythonでもRubyでも書くことができましたが、そんな中でもPHPの良さを再発見することができました。
それは、マニュアルの見やすさです。

PHPのマニュアルは説明の中に出てくる関数にリンクが貼られていて、すぐその内容を調べることができます。また、関数の説明にサンプルがかなりの確率で付いているので、すごくスクリプトを書きやすいです。

それと、比較してみるとわかるのが、キャストの柔軟性です。特に変数に型がないので、割り算の結果を少数にするのが一番簡単です。

ただ、Pythonの書き方が非常に簡単で個人的には好きです。Rubyはオブジェクト指向な部分がこのスクリプトでも quo などに表れていますが、PHPに慣れていると少しとまどってしまいます。まぁJavaScriptと同じと考えると割とすんなり入っていけるかなぁとも思いますが。

さらに、PHPの実行スピードは意外と速い。以下は実行時間を計ってみた場合のログですが、PHPが一番速く、続いてPython、Rubyは for if や変数の代入などの処理が大きいようです。


#time php monte.php
PI is about3.14408<br>
real    0m0.221s
user    0m0.214s
sys     0m0.008s


#time python monte.py
PI is about 3.14396 <br>
real    0m0.262s
user    0m0.255s
sys     0m0.006s


#time ruby monte.rb
PI is about3.14556<br>
real    0m0.400s
user    0m0.395s
sys     0m0.005s

意外とPHPは遅いと思われているかもしれないけれど、計算や繰り返し処理単体では決して遅くはありません!!!