繁体   English   中英

来自scipy.stats的随机抽取之间的差异... rvs和numpy.random

[英]Difference between random draws from scipy.stats…rvs and numpy.random

看起来它是相同的分布,从numpy.random绘制随机样本比从scipy.stats.-.rvs这样做更快。 我想知道是什么原因导致两者之间的速度差异?

scipy.stats.uniform实际上使用了numpy,这里是stats中的相应函数(mtrand是numpy.random的别名)

class uniform_gen(rv_continuous):
    def _rvs(self):
        return mtrand.uniform(0.0,1.0,self._size)

scipy.stats有一些错误检查的开销,使界面更灵活。 只要你不为每次抽奖调用uniform.rvs,速度差应该是最小的。 你可以一次性获得所有随机抽取,例如(1000万)

>>> rvs = stats.uniform.rvs(size=(10000, 1000))
>>> rvs.shape
(10000, 1000)

这是我刚才写的很长的答案:

scipy / numpy中的基本随机数由Mersenne-Twister PRNG在numpy.random中创建。 numpy.random中的分布​​随机数在cython / pyrex中并且非常快。

scipy.stats没有随机数生成器,随机数可通过以下三种方式之一获得:

  • 直接来自numpy.random,例如normal,t,...非常快

  • 通过转换numpy.random中可用的其他随机数的随机数,也非常快,因为它对整个数字数组进行操作

  • generic:唯一的通用生成随机数生成是通过使用ppf(逆cdf)来转换均匀随机数。 如果ppf有明确的表达式,这相对较快,但如果必须间接计算ppf,则速度可能非常慢。 例如,如果仅定义了pdf,则通过数值积分获得cdf,并且通过方程求解器获得ppf。 所以一些发行版很慢。

我今天碰到了这个问题,只是想在这个问题上添加一些时间细节。 我看到了俊提到其中,特别是更快速地产生从正态分布随机数numpyrvsscipy.stats 正如user333700提到有一些开销与rvs但如果要生成随机值的阵列则在此间隙关闭相比numpy 这是一个jupyter计时示例:

from scipy.stats import norm
import numpy as np

n = norm(0, 1)
%timeit -n 1000 n.rvs(1)[0]
%timeit -n 1000 np.random.normal(0,1)

%timeit -n 1000 a = n.rvs(1000)
%timeit -n 1000 a = [np.random.normal(0,1) for i in range(0, 1000)]
%timeit -n 1000 a = np.random.randn(1000)

在我使用numpy版本1.11.1和scipy 0.17.0运行时,输出:

1000 loops, best of 3: 46.8 µs per loop
1000 loops, best of 3: 492 ns per loop
1000 loops, best of 3: 115 µs per loop
1000 loops, best of 3: 343 µs per loop
1000 loops, best of 3: 61.9 µs per loop

因此,从rvs生成一个随机样本比直接使用numpy慢近100倍。 但是,如果要生成的值数组比间隙关闭(115到61.9微秒)。

如果你可以避免它,可能不要调用rvs在一个循环中获得一个随机值很多次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM