【问题标题】:Iteration calling stats.norm.pdf() runs slow迭代调用 stats.norm.pdf() 运行缓慢
【发布时间】:2018-10-24 17:34:02
【问题描述】:

我注意到以下代码需要 0.01 秒,这太长了,因为我需要它运行大约一百万次。

mydist = stats.norm(mean, 2)
for x in range(5,30):               
     probplak.append(mydist.pdf(x))

有没有其他方法可以获得类似的结果(给出平均值的值列表和远离平均值的 x 值给出标准偏差?)。

【问题讨论】:

    标签: python performance loops scipy


    【解决方案1】:

    mydist.pdf 可以传递一系列值而不是单个标量:

    probplak = mydist.pdf(range(5, 30))
    

    这比使用 for 循环更快地产生结果。

    例如,

    import scipy.stats as stats
    mean = 15
    mydist = stats.norm(mean, 2)
    probplak = mydist.pdf(range(5, 30))
    # array([7.43359757e-07, 7.99187055e-06, 6.69151129e-05, 4.36341348e-04,
    #        2.21592421e-03, 8.76415025e-03, 2.69954833e-02, 6.47587978e-02,
    #        1.20985362e-01, 1.76032663e-01, 1.99471140e-01, 1.76032663e-01,
    #        1.20985362e-01, 6.47587978e-02, 2.69954833e-02, 8.76415025e-03,
    #        2.21592421e-03, 4.36341348e-04, 6.69151129e-05, 7.99187055e-06,
    #        7.43359757e-07, 5.38488002e-08, 3.03794142e-09, 1.33477831e-10,
    #        4.56736020e-12])
    

    使用IPython进行速度比较:

    In [112]: %timeit mydist.pdf(range(5, 30))              # <-- passing sequence
    10000 loops, best of 3: 134 µs per loop
    
    In [113]: %timeit [mydist.pdf(x) for x in range(5,30)]  # <-- using a loop
    100 loops, best of 3: 2.95 ms per loop
    

    还请注意,stats.norm.pdf 不仅可以为x 传递类似数组的参数,还可以为loc(即mean)和scale(即标准偏差)传递。 这意味着如果您需要运行此代码一百万 不同的手段和尺度,那么你可以计算 一次调用所有probplaksstats.norm.pdf

    means = [1,2,3]
    std_devs = [10,20,30]
    probplaks = stats.norm.pdf(np.arange(5, 30)[:,None], means, std_devs)
    

    返回一个形状数组(25, 3)。如果您将meansstd_devs 更改为具有一百万个值的列表,那么probplaks.shape 将是(25, 10**6)

    一次调用 stats.norm.pdf 计算所有问题将比在 Python 循环中调用一百万次 mydist.pdf 快得多:

    In [117]: %timeit stats.norm.pdf(np.arange(5, 30)[:,None], means, scales)
    10000 loops, best of 3: 135 µs per loop
    
    In [118]: %timeit [[stats.norm(m, s).pdf(x) for x in range(5,30)] for m,s in zip(means,scales)]
    10 loops, best of 3: 64.4 ms per loop
    

    【讨论】:

      猜你喜欢
      • 2018-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 2013-04-19
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多