当前位置: 首页 > 知识库问答 >
问题:

numpy之间的性能差异。随机的,随机的。Python中的随机

岑经纶
2023-03-14

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

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

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

然而,我不知道哪个软件包的性能更好(在速度方面):numpy还是random。所以我想找到两种包装的种子,它们对应于完全相同的梅森扭转序列。这样一来,两个模型的图形都是相同的,因此每个梯度下降步骤中的迭代次数也是相同的,这导致了速度上的差异,这只是由我使用的包引起的。

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

我尝试了以下方法:

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))

但这并没有真正起作用,这是可以预料的。

共有3个答案

东郭勇
2023-03-14

重复这篇文章

答案取决于需求:
-加密/安全:秘密
-科学研究:numpy
-常用:随机

刘海
2023-03-14

考虑以下肮脏的黑客:

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

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

秦昂然
2023-03-14

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

在种子方面:您可以使用numpy中的set_stateget_state函数。random(在python中称为getstatesetstate)并将状态从一个传递到另一个。结构略有不同(在python中,posinteger附加到状态元组的最后一个元素)。参见numpy的文档。随机的获取_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中提供的html" target="_blank">方法类似RandomState除了具有NumPy意识之外,还有一个优点,即它提供了更多的概率分布供选择。

 类似资料:
  • 问题内容: Tensorflow中是否有等效于numpy随机选择的函数。在numpy中,我们可以从给定列表中随机获得一个项目及其权重。 此代码将从给定列表中选择一个权重为p的项。 问题答案: 不,但是您可以使用tf.multinomial获得相同的结果: 该部分在这里,正如预期的那样,该批次中每个元素的行都有未归一化的对数概率,并且对于样本数量还具有另一个维度。

  • numpy.random 模块对 Python 内置的 random 进行了补充,增加了一些用于高效生成符合多种概率分布的样本值的函数。这一小节将详述如何用 Numpy 快速创建随机数矩阵。 1. 创建符合均匀分布的随机数组 1.1 numpy.random.rand 函数 numpy.random.rand 函数通常用来创建一个服从 “0~1” 均匀分布的随机浮点数(组),随机样本取值范围是[0

  • 我不熟悉随机文件访问,我遇到了一个问题——据我所知,RandomAccessFile类提供了一个用于读/写的随机访问文件。我可以使用seek()方法移动到首选位置并开始阅读或写作,但在这种情况下并不重要。完全是随机访问吗?但在FileInputStream中,我有同样的能力 这种方法提供了我从某个特定的地方阅读。那么,有什么区别呢?(我猜,输入流读取所有文件,但只是通过断路位置之前的所有符号,但它

  • aliyun 的 redis lua 的随机值不随机!? 同样的函数,在 redis 官方的 7.2.1 下面是每次都可以取到随机的 cookie 但是在 aliyun 的 redis 下面,每次取到的值都是一样的

  • 问题内容: 当您要依次遍历数字列表时,您将编写: 但是,如果要随机遍历范围(0..999)的数字列表怎么办?需要(在每个迭代中)随机选择在任何先前迭代中未选择的数字,并且需要对范围(0..999)内的所有数字进行迭代。 你知道该怎么做(聪明)吗? 问题答案: 您可以习惯随机播放列表: 顺便说一句,在许多情况下,您将在其他编程语言中使用整数范围内的循环,则可以直接描述要在Python中迭代的“事物”

  • 问题内容: 当他每次运行程序时都不断获得相同的数字时,我试图向Java解释随机数生成器。我为同一件事创建了自己的简单版本,每次运行该程序时,我也得到了与他得到的确切数字相同的数字。 我究竟做错了什么? 100个数字中的最后五个数字是: 问题答案: 您已经为随机数生成器提供了恒定的值。它是确定性的,因此每次运行都会生成相同的值。 我不确定您为什么选择使用作为种子,但是种子值与生成的值范围无关(这是由