首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >numpy.random与random.random在Python中的性能差异

numpy.random与random.random在Python中的性能差异
EN

Stack Overflow用户
提问于 2019-07-26 13:12:39
回答 3查看 5.6K关注 0票数 5

我想看看在我的神经网络中,随机数发生器包的速度更快。

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

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

但是,我不知道哪个包会表现得更好(就速度而言):numpy还是随机的。因此,我想找到种子的两个包,对应完全相同的Mersenne序列。这样,两个模型的绘图是相同的,因此每个梯度下降步骤中的迭代次数也是相同的,导致速度的差异仅由我使用的包造成。

我找不到任何关于种子对的文档,它们的结果是两个包的随机数序列相同,而且尝试各种组合似乎有点麻烦。

我尝试了以下几点:

代码语言:javascript
复制
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))

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-26 14:23:36

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

关于种子:您可以使用numpy.random中的set_stateget_state函数(在pythonrandom中称为getstatesetstate),并将状态从一个传递到另一个。结构略有不同(在python中,pos整数附加到状态元组中的最后一个元素)。参见状态()random.getstate()的文档

代码语言:javascript
复制
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通常更好,因为您可以创建元素数组而不需要循环:

代码语言:javascript
复制
%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模块“随机”还包含一个Mersenne伪随机数生成器,其中有许多类似于RandomState中可用的方法。RandomState除了具有NumPy感知能力外,还具有提供更多概率分布可供选择的优点。

票数 11
EN

Stack Overflow用户

发布于 2019-07-26 14:01:53

考虑以下肮脏的攻击:

代码语言:javascript
复制
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())

输出:

代码语言:javascript
复制
0.6394267984578837 0.3745401188473625  # different
0.9507143064099162 0.9507143064099162  # same

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

票数 1
EN

Stack Overflow用户

发布于 2019-07-26 13:41:59

复制此帖子

答案取决于需要:

  • 密码学/安全:秘密
  • 科学研究:矮胖
  • 常用:随机
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57220804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档