|
发表于 2017-7-18 21:06:03
|
显示全部楼层
一样的思想,用了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 %
复制代码 |
|