对于近似计算圆周率的方法,考虑使用随机方法,通过生成随机数并测试其是否在单位圆内来进行计算。
import random as rd
import numpy as np
def r(_): return rd.random()
def np_pi(n):
v_r = np.vectorize(r)
x = v_r(np.zeros(n))
y = v_r(np.zeros(n))
return sum (x*x + y*y <= 1) * 4. / n
请注意,随机数生成依赖于Python标准库;但是考虑使用numpy进行随机数生成。
def np_pi(n):
x = np.random.random(n)
y = np.random.random(n)
return sum (x*x + y*y <= 1) * 4. / n
考虑非向量化方法,
import random as rd
def dart_board():
x,y = rd.random(), rd.random()
return (x*x + y*y <= 1)
def pi(n):
s = sum([dart_board() for _ in range(n)])
return s * 4. / n
非矢量化形式的平均速度比矢量化形式快四倍,例如考虑
n = 5000000
和操作系统命令行如下所示(Python 2.7,四核,8GB RAM,RedHat Linux)。time python pi.py
time python np_pi.py
因此,如何改进矢量化方法以提高其性能是一个需要探讨的问题。