在python中获取100万到100万之间随机数的最快方法

在python中获取100万到100万之间随机数的最快方法,python,numpy,random,Python,Numpy,Random,实现这一目标的最快方式是什么?我每天要做100多万次,所以我希望效率最高 使用numpy(20次运行后的平均值0.0001679009692429128) 随机(平均值:0.0000924923272555262) 令我惊讶的是,random始终比numpy跑得快。有没有更快的方法?我写了一个测试程序。它表明完成任务只需1秒。所以,无论你想写什么,它都不会成为你的瓶颈 #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Xiang Wang @ 20

实现这一目标的最快方式是什么?我每天要做100多万次,所以我希望效率最高

使用numpy(20次运行后的平均值0.0001679009692429128)

随机(平均值:0.0000924923272555262)


令我惊讶的是,random始终比numpy跑得快。有没有更快的方法?

我写了一个测试程序。它表明完成任务只需1秒。所以,无论你想写什么,它都不会成为你的瓶颈

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Xiang Wang @ 2018-05-23 16:49:00

import time
import random

start = time.time()

for i in range(1000000):
    random.randint(1, 1000000)

end = time.time()

print("total time: {}".format(end-start))

我写了一个测试程序。它表明完成任务只需1秒。所以,无论你想写什么,它都不会成为你的瓶颈

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Xiang Wang @ 2018-05-23 16:49:00

import time
import random

start = time.time()

for i in range(1000000):
    random.randint(1, 1000000)

end = time.time()

print("total time: {}".format(end-start))

如果您使用的是numpy,一次生成所需的所有值会更高效。python和numpy都使用Mersenne Twister。更多信息:

如果您使用的是numpy,那么一次生成所需的所有值会更高效。python和numpy都使用Mersenne Twister。更多信息:

numpy
在生成随机数的大样本(数组)时效率更高。比如说,

In [10]: %timeit np.random.randint(1,1000000, 1000000)
5.14 ms ± 64.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [11]: %timeit [random.choice(range(1,1000000)) for _ in range(1000000)]
1.01 s ± 14.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
此外,请参见关于如何执行定时测试的说明。当您使用
time.clock()
时,至少应尝试多次重复该操作,然后计算平均时间。最好使用
timeit
进行定时测试。另外,正如其他人在评论中提到的,
print()
生成随机数所需的时间要长得多,因此您的计时测试主要是测量
print()
的工作速度。相反,您应该这样做:

In [12]: repeat = 1000000
    ...: t0 = time.clock()
    ...: for _ in range(repeat):
    ...:     np.random.randint(1, 1000000)
    ...: t1 = time.clock()
    ...: print((t1 - t0) / repeat)
1.3564629999999908e-06

In [13]: repeat = 1000000
    ...: t2 = time.clock()
    ...: for _ in range(repeat):
    ...:     random.choice(range(1, 1000000))
    ...: t3 = time.clock()
    ...: print((t3 - t2) / repeat)
1.0206699999999956e-06

因此,对于单个数字,
numpy
平均比内置的随机数生成器慢大约35%。但是,以前的测试表明,在生成大样本时,
numpy
的速度明显更快。

numpy
在生成随机数的大样本(数组)时效率更高。比如说,

In [10]: %timeit np.random.randint(1,1000000, 1000000)
5.14 ms ± 64.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [11]: %timeit [random.choice(range(1,1000000)) for _ in range(1000000)]
1.01 s ± 14.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
此外,请参见关于如何执行定时测试的说明。当您使用
time.clock()
时,至少应尝试多次重复该操作,然后计算平均时间。最好使用
timeit
进行定时测试。另外,正如其他人在评论中提到的,
print()
生成随机数所需的时间要长得多,因此您的计时测试主要是测量
print()
的工作速度。相反,您应该这样做:

In [12]: repeat = 1000000
    ...: t0 = time.clock()
    ...: for _ in range(repeat):
    ...:     np.random.randint(1, 1000000)
    ...: t1 = time.clock()
    ...: print((t1 - t0) / repeat)
1.3564629999999908e-06

In [13]: repeat = 1000000
    ...: t2 = time.clock()
    ...: for _ in range(repeat):
    ...:     random.choice(range(1, 1000000))
    ...: t3 = time.clock()
    ...: print((t3 - t2) / repeat)
1.0206699999999956e-06

因此,对于单个数字,
numpy
平均比内置的随机数生成器慢大约35%。但是,以前的测试表明,在生成大样本时,
numpy
的速度明显更快。

random。getrandbits
似乎比其他
random
模块工具快得多

%timeit random.randint(0,1000000)                                                                                                                                                                                                                                     
799 ns ± 2.45 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit random.choice(range(0,1000000))                                                                                                                                                                                                                               
742 ns ± 13.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit random.getrandbits(20)                                                                                                                                                                                                                                        
83.9 ns ± 1.61 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
请阅读以下内容以了解更多信息:
random.getrandbits
似乎比其他
random
模块工具快得多

%timeit random.randint(0,1000000)                                                                                                                                                                                                                                     
799 ns ± 2.45 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit random.choice(range(0,1000000))                                                                                                                                                                                                                               
742 ns ± 13.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit random.getrandbits(20)                                                                                                                                                                                                                                        
83.9 ns ± 1.61 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
请阅读以下内容以了解更多信息:

对于一台计算机来说,每天一百万次是一个非常小的数目。方法在这里并不重要。为什么不生成100万个数字一次,并在需要时从中读取。打印时间比生成随机数的时间多几个数量级。调用
random.choices(范围(11000000),k=1000000)
大约需要半秒。如果你必须每天做一次,这真的不应该是一个“我想要最高效率”的问题——你可能花在编写计时测试和撰写这个问题上的时间比你的CPU每天生成一百万个数字的时间要多,即使你的程序在你的余生中每天都在运行。过早优化并不能有效地利用程序员的时间。每天一百万次对计算机来说是一个非常小的数目。方法在这里并不重要。为什么不生成100万个数字一次,并在需要时从中读取。打印时间比生成随机数的时间多几个数量级。调用
random.choices(范围(11000000),k=1000000)
大约需要半秒。如果你必须每天做一次,这真的不应该是一个“我想要最高效率”的问题——你可能花在编写计时测试和撰写这个问题上的时间比你的CPU每天生成一百万个数字的时间要多,即使你的程序在你的余生中每天都在运行。过早优化不是程序员时间的有效利用。