驚き!処理速度比較 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になります。