一样的思想,用了4种写法,结果numpy快了好几个数量级import random
import math
import time
import numpy
# 通过参数半径r及实验次数trial返回pi估计值,涉及平方和用整数可能会好算一点,集合可能会缩小概率,还是用列表
# 直接在推导式中判断,然后返回
def cal_pi_1(r,trial):
return 4*len([1 for i in range(trial) if (random.randint(-r,r)**2+random.randint(-r,r)**2)<=r**2])/ trial
# 将生成和判断分开两半,瞅瞅有没有变化
def cal_pi_2(r,trial):
q = [(random.randint(-r,r),random.randint(-r,r)) for i in range(trial)]
w = [1 for i in q if i[0]**2+i[1]**2 <= r**2]
return 4*len(w)/ trial
# 不用推导式,直接循环赋值
def cal_pi_3(r,trial):
p=0
for i in range(trial):
a,b = random.randint(-r,r),random.randint(-r,r)
if a**2+b**2 <= r**2:
p +=1
return (4*p/trial)
# 使用 numpy 库,数字比较大,没有定好dtype会出错
def cal_pi_4(r,trial):
m = numpy.random.randint(-r,r+1,trial,dtype=numpy.int64)
n = numpy.random.randint(-r,r+1,trial,dtype=numpy.int64)
k = pow(m,2)+pow(n,2)
return (4*len(numpy.nonzero(k<=r**2)[0])/trial)
r = 100000,trial = 100000
结果##第1个函数耗时 1.0870623s -----:my pi is: 3.13892 ,error approaches to 0.0850732 %
##第2个函数耗时 1.1000628s -----:my pi is: 3.14136 ,error approaches to 0.0074055 %
##第3个函数耗时 1.0660610s -----:my pi is: 3.1406 ,error approaches to 0.0315971 %
##第4个函数耗时 0.0110006s -----:my pi is: 3.14204 ,error approaches to 0.0142394 %
|