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

Python中numpy.random和random.random的性能差异,python,performance,numpy,random,random-seed,Python,Performance,Numpy,Random,Random Seed,我想看看哪个随机数生成器包在我的神经网络中更快 我目前正在更改github的一个代码,其中numpy.random和random包都用于生成随机整数、随机选择、随机样本等 我之所以更改此代码,是因为出于研究目的,我希望设置一个全局种子,以便能够比较超参数不同设置的精度性能。问题是,现在我必须设置两个全局种子,一个是随机包,另一个是numpy包。理想情况下,我只想设置一个种子,因为来自两个随机数生成器序列的图形可能会更快地关联起来 然而,我不知道哪个软件包的性能更好(在速度方面):numpy还是r

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

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


我之所以更改此代码,是因为出于研究目的,我希望设置一个全局种子,以便能够比较超参数不同设置的精度性能。问题是,现在我必须设置两个全局种子,一个是随机包,另一个是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))
但这并没有真正起作用,这是可以预料的

重复这一点

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

答案取决于需求:
-加密/安全:机密
-科学研究: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

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

考虑以下肮脏的攻击:

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
以不同的方式工作,尽管正如您所说,它们使用相同的算法

关于seed:您可以使用
numpy.random
中的
set_state
get_state
函数(在python中称为
random
setstate
)将状态从一个传递到另一个。结构略有不同(在python中,
pos
integer附加到状态元组中的最后一个元素)。有关和,请参阅文档:

在效率方面:这取决于您想要做什么,但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
中提供的类似<代码>随机状态, 除了具有NumPy意识之外,它还有一个优势,那就是它提供了一个 更多的概率分布可供选择


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

关于seed:您可以使用
numpy.random
中的
set_state
get_state
函数(在python中称为
random
setstate
)将状态从一个传递到另一个。结构略有不同(在python中,
pos
integer附加到状态元组中的最后一个元素)。有关和,请参阅文档:

在效率方面:这取决于您想要做什么,但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
中提供的类似<代码>随机状态, 除了具有NumPy意识之外,它还有一个优势,那就是它提供了一个 更多的概率分布可供选择


简单回顾一下。NumPy的
np.random.randint(a,b)
不同于
random.randint(a,b)


简单回顾一下。NumPy的
np.random.randint(a,b)
不同于
random.randint(a,b)


我之前读过那篇文章,我不会说这是那篇文章的重复。我想在我的整个代码中比较两个包的总体性能。在性能上比较两个包中的每个函数需要做很多工作,即使我这样做了,我也应该计算每个random/numpy.random函数被调用的次数。如果我能把整个程序运行两次就好了;一次使用numpy.random,一次使用random包,使用相同的随机数序列,因此我真正了解我的程序在性能上的差异。“我更改此代码的原因是出于研究目的”=>“numpy.random库包含一些在科学研究中常用的额外概率分布”您的“测试”算法还必须对平均结果进行评估(处理器不会以相同的方式调度两个程序,可能会同时运行一些消耗资源的程序等等),我明白您的意思。我试图通过在仅由该程序使用的服务器上连续运行这两个程序来说明处理器的使用情况。当然总有一些小的偏差,我试着控制f