Python中numpy.random和random.random之间的性能差异
问题内容:
我想看看我的神经网络中哪种随机数生成器包更快。
我目前正在从github更改代码,其中numpy.random和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))
但这并没有真正发挥作用,正如可以预期的那样。
问题答案:
numpy.random
和python的random
工作方式不同,尽管正如您所说,它们使用相同的算法。
就种子而言
:可以使用from中的set_state
andget_state
函数numpy.random
(在python中random
称为getstate
和setstate
),并将状态从一个传递到另一个。结构略有不同(在python中,pos
整数附加到状态元组中的最后一个元素)。请参阅numpy.random.get_state()和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)
在“随机性”方面
,numpy(根据他们的文档)也更好:
注意:Python stdlib模块“ random”还包含Mersenne
Twister伪随机数生成器,其生成方法与中提供的方法类似RandomState
。RandomState
除了具有NumPy感知能力外,它还具有提供大量概率分布可供选择的优势。