numpy.random 和 random.random 在 Python 中的性能差异

Performance difference between numpy.random and random.random in Python

我想看看在我的神经网络中哪个随机数生成器包更快。

我目前正在更改 github 的代码,其中 numpy.random 和随机包都用于生成随机整数、随机选择、随机样本等

我更改此代码的原因是,出于研究目的,我想设置一个全局种子,以便能够比较不同超参数设置的准确度性能。问题是此时我必须为随机包和 numpy 包设置 2 个全局种子。理想情况下,我只想设置一个种子,因为来自两个随机数生成器序列的绘图可能会更快地变得相关。

但是,我不知道哪个包会表现更好(在速度方面):numpy 还是 random。所以我想为两个包找到与完全相同的 Mersenne Twister 序列相对应的种子。这样,两个模型的图纸是相同的,因此每个梯度下降步骤中的迭代次数也相同,导致速度差异仅由我使用的包引起。

我找不到任何关于两个包以相同随机数序列结束的种子对的文档,而且尝试所有类型的组合似乎有点麻烦。

我尝试了以下方法:

np.random.seed(1)
numpy_1=np.random.randint(0,101)
numpy_2=np.random.randint(0,101)
numpy_3=np.random.randint(0,101)
numpy_4=np.random.randint(0,101)
for i in range(20000000):
    random.seed(i)
    random_1=random.randint(0,101)
    if random_1==numpy_1:
        random_2=random.randint(0,101)
        if random_2==numpy_2:
            random_3=random.randint(0,101)
            if random_3==numpy_3:
                random_4=random.randint(0,101)
                if random_4==numpy_4:
                    break
print(np.random.randint(0,101))
print(random.randint(0,101))

但这并没有像预期的那样真正起作用。

重复post

根据需要回答:
- 密码学/安全:秘密
- 科学研究:numpy
- 常用:随机

考虑以下肮脏的技巧:

import random
import numpy as np

random.seed(42)
np.random.seed(42)

print(random.random(), np.random.random())

# copy numpy random module state to python random module
a = random.getstate()
b = np.random.get_state()
a2 = (a[0], tuple(int(val) for val in list(b[1]) + [a[1][-1]]), *a[2:])
random.setstate(a2)

print(random.random(), np.random.random())

输出:

0.6394267984578837 0.3745401188473625  # different
0.9507143064099162 0.9507143064099162  # same

不确定这种方式在两种实现的所有可能性中是否真的一致。

numpy.random 和 python random 以不同的方式工作,尽管如您所说,它们使用相同的算法。

就种子而言:您可以使用numpy.random中的set_stateget_state函数(在pythonrandom 调用了 getstatesetstate) 并将状态从一个传递到另一个。结构略有不同(在 python 中, pos 整数附加到状态元组中的最后一个元素)。请参阅 numpy.random.get_state() and random.getstate():

的文档
import random
import numpy as np
random.seed(10)
s1 = list(np.random.get_state())
s2 = list(random.getstate())

s1[1] = np.array(s2[1][:-1]).astype('int32')
s1[2] = s2[1][-1]

np.random.set_state(tuple(s1))

print(np.random.random())
print(random.random())
>> 0.5714025946899135
0.5714025946899135

在效率方面:这取决于你想做什么,但 numpy 通常更好,因为你可以创建元素数组而不需要循环:

%timeit np.random.random(10000)
142 µs ± 391 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit [random.random() for i in range(10000)]
1.48 ms ± 2.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

在"randomness"方面,numpy是(根据他们docs),也更好:

Notes: The Python stdlib module "random" also contains a Mersenne Twister pseudo-random number generator with a number of methods that are similar to the ones available in RandomState. RandomState, besides being NumPy-aware, has the advantage that it provides a much larger number of probability distributions to choose from.