【问题标题】:Numba and Numpy Random Number interactionNumba 和 Numpy 随机数交互
【发布时间】:2019-06-22 13:28:52
【问题描述】:

我正在尝试快速生成一堆随机数来进行 MCMC。

我有以下基准:

@njit
def getRandos(n):
    for i in prange(n):
        a = np.random.rand()


%timeit np.random.rand(1000000000)
13.1 s ± 287 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit getRandos(1000000000)
1.97 s ± 25.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

显然,并行化改善了我的运行时间。但是,我不知道随机数生成的播种是如何工作的。如何确保这些数字是真正随机的?我必须以某种方式随机选择种子吗?

【问题讨论】:

  • 为什么需要随机种子?种子是您的控制旋钮
  • 我正在并行化它,我想确保每个线程都返回真正的随机数
  • 在 numpy 或 numba 中都没有真正的随机数 - 它们都是伪随机数生成器。通过控制种子,您应确保线程随机数序列之间不重叠

标签: python python-3.x numpy random numba


【解决方案1】:

您没有苹果与苹果之间的比较。第一次调用np.random.rand(1000000000) 花费了大量时间来创建空间和存储随机数,而第二次调用getRandos(1000000000) 只是生成值并丢弃它们。

这是苹果与苹果的比较(速度差不多):

from numba import prange, njit
import numpy as np

@njit
def getRandos(n):
    a = np.zeros(n)
    for i in prange(n):
        a[i] = np.random.rand()
    return a

%timeit -n 100 getRandos(100000)
%timeit -n 100 np.random.rand(100000)

但是,要回答您的问题,请参考 numba 文档 here

它们不允许您创建单独的 RandomState 实例,但您可以在定义中设置种子。

@njit
def getRandos(n):
    np.random.seed(1111)
    a = np.zeros(n)
    for i in prange(n):
        a[i] = np.random.rand()
    return a


values = getRandos(100000)
values2 = getRandos(100000)
print(all(values == values2))  # True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2019-11-17
    相关资源
    最近更新 更多