見出し画像

驚き!処理速度比較 VBA vs Python vs JavaScript・・・ JavaScriptが圧倒的に速く Python が呆れるほど遅い

円周率の計算でコンピュータの処理能力がわかる

 PCの処理能力を円周率計算で測定した結果、使う言語によって大きな差がありました。VBAはその特性からあまり速さを追求していませんが、PythonとJavaScriptの差が大きいことに驚きました。計算回数もアルゴリズムも同じコードを使い、VBAが44秒に対しPythonは1分29秒、そしてJavaScriptは何と1秒未満で処理を終えました。googleがスプレッドシートのマクロにPython ではなくJavaScriptを採用したことに納得です。

簡易的に円周率を求める方法

下の画像は半径5㎝の円の右上部分を、一辺が5㎝の正方形の中に描いてあります。正方形の面積は5cm×5cm=25㎠で、半径の2乗に等しくなります。1/4円の面積はマス目を読んで、だいたい19.5㎠くらい、だから半径5cmの円の面積は19.5×4㎠になります。これより

円の面積:半径の2乗=19.5×4:25
円の面積=19.5×4/25×半径の2乗 

19.5×4/25が円周率に相当する部分で、電卓で計算すると3.12になります。この方法をPCに応用します。

円周率を求める計算

面積の代わりに点の数を使う

1/4円の面積と正方形の面積の比は正方形の中に無数の点を書き込み、その比を求めます。
つまり
1/4円の面積/正方形の面積 = 1/4円に入った点の数/正方形の中の点の数
 

点の座標を(x,y)とすると円の中の点は            x^2+y^2<=r^2が成り立つ

 ピタゴラスの定理から図中のx、y、rの間には
  x^2+y^2=r^2(^はべき乗)
がなりたちます。したがって円の中に入る点は半径の内側だから
  x^2+y^2<=r^2 
がなりたっています。これより
1/4円に入った点の数/正方形の中の点の数
=(x^2+y^2<=r^2が成り立つ点の数)/打ち込んだ点の数
円周率はこの比に4をかけた数値です。 

この計算をVBA、Python、JavaScriptを使い、同じアルゴリズムでコード化しました。下コードは半径が10000、つまり10000点を打ち込んだ場合です。なおPythonはGoogle Colaboratory, JavaScriptはGoogle SpreadSheet上のGASをつかっています。GASはsheetとやりとりしてないのでJavaScriptそのものです。VBAはPC内で処理しており、他の二つはGoogle のサーバーを使っているため厳密に言語だけの比較とは言えませんが、言語による差が大きいことは確認できます。

VBAのコード

Sub ensyuritu()

r = 10000
For x = 1 To r
 For y = 1 To r
 
  If x ^ 2 + y ^ 2 <= r ^ 2 Then
   cnt = cnt + 1
  End If
  Next y
  Next x
  
  P = 4 * cnt / r ^ 2
 
 Debug.Print P
 
End Sub

Pythonのコード

r= 10000
cnt=0
for x in range(1,r):
 for y in range(1,r):
  if pow(x,2)+pow(y,2)<=pow(r,2): 
    cnt+=1
P = 4 * cnt / pow(r,2)
print (P)

JavaScript(Google Apps Script)のコード

function myFunction() {
 let r = 10000
 let cnt=0
 for(let x = 1; x<r+1;x++){
 for(let y = 1;y<r+1;y++){
   if( Math.pow(x,2) + Math.pow(y,2) <= Math.pow(r,2)){
       cnt=cnt+1;
     }
   }
 }
 
 let P = 4 * cnt / Math.pow(r,2)
   
  console.log(P)
}

計算結果はどれも3.14119052になります。

実験動画