python使用级数pi的近似值_JavaScript与Python计算pi的近似值运行时间对比

平时用零碎的时间看python的教程,难得有一块空闲时间,用来检验一下成果。

常见的使用编程语言计算π近似值的方法有蒙特卡罗法(由落在正方形内1/4扇形概率为πR2/4R2 = k/n推导 )、定积分法和泰勒级数法等,本人现采用泰勒级数法计算,原理为:

848fce0ac647?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

反正切泰勒级数

别紧张,我们不会直接拿这个公式计算,因为当x=1时,arctanx = π/4,上面的级数就变成了这个样子:

848fce0ac647?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

arctan1

以及这个样子:

848fce0ac647?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

最终形态

变成这样就很直观了,下面就开始着手计算吧,先上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不同

结果:

848fce0ac647?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

848fce0ac647?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

如果参数足够大,结果就越精确

接下来进入正题,计算二者跑函数的时间:

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())

848fce0ac647?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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())

848fce0ac647?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Python运行效率(s)

这下对于两者的运行速度有了直观的认识了

日后回忆:

根据这样的结果就直接评判一个脚本语言的优劣是有失偏颇的,真正的性能瓶颈并不在调用api时产生(关键的影响性能的代码写在静态语言里),python和node近年应用面飞速扩展,也得益于各自社区环境的完善,根据业务需求与场景,选择适合的架构而非纯粹追求脚本运行速度才是一个developer更加关心的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值