Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于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 - Fatal编程技术网

基于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

基于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(),

因此,您需要询问如何改进向量化方法以提高其性能。

您正在调用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(), 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