gpt4 book ai didi

python - 迭代调用 stats.norm.pdf() 运行缓慢

转载 作者:太空宇宙 更新时间:2023-11-03 14:44:52 24 4
gpt4 key购买 nike

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

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

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

最佳答案

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 传递类似数组的参数(即标准偏差)。这意味着如果你需要运行这段代码一百万不同的方法和尺度,那么你可以计算一次调用 stats.norm.pdf 即可同时获得所有 probplak:

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

关于python - 迭代调用 stats.norm.pdf() 运行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50340791/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com