基于montecarlo的Pi计算的Python高效矢量化 逼近PI值的考虑这种随机方法填充随机值的数组和单位圆包含的测试, 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内置的基于montecarlo的Pi计算的Python高效矢量化 逼近PI值的考虑这种随机方法填充随机值的数组和单位圆包含的测试, 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,vectorization,montecarlo,pi,Python,Numpy,Vectorization,Montecarlo,Pi,因此,您需要询问如何改进向量化方法以提高其性能。您正在调用python内置的sum,而不是numpy的向量化方法sum: import numpy as np import random as rd def np_pi(n): x = np.random.random(n) y = np.random.random(n) return (x*x + y*y <= 1).sum() def dart_board(): x,y = rd.random(),
sum
,而不是numpy的向量化方法sum
:
import numpy as np
import random as rd
def np_pi(n):
x = np.random.random(n)
y = np.random.random(n)
return (x*x + y*y <= 1).sum()
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)])
我猜想,在numpy数组上调用内置的
sum
会通过在数组上迭代而不是使用矢量化例程来产生开销。请注意,使用蒙特卡罗方法来计算pi是可行的,因此除了演示蒙特卡罗技术之外,它对任何事情都是无用的。“如果你想用一种快速的方法来计算π,最好用某种方法。”巴斯温克尔完全同意,这是对numpy及其效率的首次探索。
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
time python pi.py
time python np_pi.py
import numpy as np
import random as rd
def np_pi(n):
x = np.random.random(n)
y = np.random.random(n)
return (x*x + y*y <= 1).sum()
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)])
In [12]: %timeit np_pi(10000)
1000 loops, best of 3: 250 us per loop
In [13]: %timeit pi(10000)
100 loops, best of 3: 3.54 ms per loop