Ответ 1
scipy.stats.uniform на самом деле использует numpy, вот соответствующая функция в статистике (mtrand является псевдонимом для numpy.random)
class uniform_gen(rv_continuous):
def _rvs(self):
return mtrand.uniform(0.0,1.0,self._size)
scipy.stats имеет немного накладных расходов для проверки ошибок и делает интерфейс более гибким. Разница в скорости должна быть минимальной, если вы не назовете uniform.rvs в цикле для каждой ничьей. Вы можете получить вместо этого все случайные розыгрыши сразу, например (10 миллионов)
>>> rvs = stats.uniform.rvs(size=(10000, 1000))
>>> rvs.shape
(10000, 1000)
Вот длинный ответ, который я написал некоторое время назад:
Основные случайные числа в scipy/numpy создаются Мерсенн-Твистер PRNG в numpy.random. Случайные числа для дистрибутивы в numpy.random находятся в cython/pyrex и довольно быстро.
scipy.stats не имеет генератора случайных чисел, случайные числа полученных одним из трех способов:
-
непосредственно из numpy.random, например. normal, t,... довольно быстро
-
случайные числа путем преобразования других случайных чисел, которые доступно в numpy.random, также довольно быстро, потому что это работает целые массивы чисел
-
generic: генерация случайных чисел только генерации генерируется по используя ppf (обратный cdf) для преобразования равномерных случайных чисел. Это относительно быстро, если имеется явное выражение для ppf, но может быть очень медленным, если ppf нужно вычислить косвенно. Например, если только PDF определен, то cdf полученных путем численного интегрирования, и ppf получается через решение уравнения. Поэтому несколько распределений очень медленные.