似乎如果它是相同的分布,从numpy.random中随机抽取样本比从scipy.stats.-.rvs中抽取样本更快。我想知道是什么原因造成了两者之间的速度差异?
发布于 2010-10-23 12:18:31
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中的基本随机数是由numpy.random中的Mersenne-Twister PRNG创建的。numpy.random中的发行版的随机数在cython/pyrex中,而且速度非常快。
scipy.stats没有随机数生成器,可以通过以下三种方式之一获得随机数:
直接从numpy.random生成正常,例如,t,...通过变换numpy.random中提供的其他随机数来生成非常快的
发布于 2016-10-21 00:34:30
我今天遇到了这个问题,只是想在这个问题上添加一些时间细节。我看到了joon提到的,特别是在scipy.stats中,使用numpy生成正态分布的随机数比使用rvs生成要快得多。正如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因此,与直接使用numpy相比,仅从rvs生成一个随机样本几乎要慢100倍。但是,如果您正在生成一个值数组,则差距会缩小(115到61.9微秒)。
如果可以避免这种情况,最好不要在循环中多次调用rvs来获得一个随机值。
https://stackoverflow.com/questions/4001577
复制相似问题