平時用零碎的時間看python的教程,難得有一塊空閑時間,用來檢驗一下成果。
常見的使用編程語言計算π近似值的方法有蒙特卡羅法(由落在正方形內1/4扇形概率為πR2/4R2 = k/n推導 )、定積分法和泰勒級數法等,本人現采用泰勒級數法計算,原理為:
反正切泰勒級數
別緊張,我們不會直接拿這個公式計算,因為當x=1時,arctanx = π/4,上面的級數就變成了這個樣子:
arctan1
以及這個樣子:
最終形態
變成這樣就很直觀了,下面就開始著手計算吧,先上JS代碼:
function unfoldPiTaylor(num){
var sum = 0,flag = true;
for(var i = 0; i < num; i++){
sum += flag?(1/(2*i+1)):(-1/(2*i+1))
flag = !flag;
}
return sum * 4;
}
console.log("π的近似值:" + unfoldPiTaylor(10000000))
接著是Python(Python3)
#! /usr/bin/env python3
def TaylorPi(k):
sum,odd = 0,True
for i in range(1,k):
sum += 1/(2*i-1) if odd==True else -1/(2*i-1)
odd = not odd
return sum*4
print("Taylor unfold value is :%f"%TaylorPi(10000000)) #print與python2不同
結果:
image.png
如果參數足夠大,結果就越精確
接下來進入正題,計算二者跑函數的時間:
function unfoldPiTaylor(num){
var sum = 0,flag = true;
for(var i = 0; i < num; i++){
sum += flag?(1/(2*i+1)):(-1/(2*i+1))
flag = !flag;
}
return sum * 4;
}
function caculateRunTime(){
var timSum = 0,start = 0,term = 0;
for(var j = 0; j < 100; j++){
start = new Date().getTime()
unfoldPiTaylor(10000000);
term = new Date().getTime() - start
timSum += term
console.log("one term done , duration:" + term/1000 + "ms");
}
return "total time:" + timSum + "ms. averange:" + timSum/100 + "ms"
}
console.log(caculateRunTime())
JS運行效率(ms)
#!/usr/bin/env python3
import time #時間模塊
# Caculate PI with Taylor series
def TaylorPi(k):
sum,odd = 0,True
for i in range(1,k):
sum += 1/(2*i-1) if odd==True else -1/(2*i-1)
odd = not odd
return sum*4
def caculateRunTime():
before = time.time() #生成開始時間,單位為秒
timeSum = 0
for i in range(100):
start = time.time()
TaylorPi(10000000)
term = time.time() - start #每次循環耗時
print("one term done, duration:",term)
timeSum += term #累加
return "total:%lf,averange:%lf"%(timeSum,timeSum/100)
print(caculateRunTime())
Python運行效率(s)
這下對于兩者的運行速度有了直觀的認識了
日后回憶:
根據這樣的結果就直接評判一個腳本語言的優劣是有失偏頗的,真正的性能瓶頸并不在調用api時產生(關鍵的影響性能的代碼寫在靜態語言里),python和node近年應用面飛速擴展,也得益于各自社區環境的完善,根據業務需求與場景,選擇適合的架構而非純粹追求腳本運行速度才是一個developer更加關心的問題。