关于numpy:在python中获得1到1百万之间随机数的最快方法

Fastest way to get a random number between 1 and 1million in python

实现这一目标的绝对最快方式是什么? 我每天会这样做超过100万次,所以我想要最高效率。

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

1
2
3
4
t0 = time.clock()
print(np.random.randint(1,1000000))
t1 = time.clock()
print (t1-t0)

随机(平均值:0.0000920492372555262)

1
2
3
4
t2 = time.clock()
print(random.choice(range(1,1000000)))
t3 = time.clock()
print (t3-t2)

令我惊讶的是,随机性一直比numpy快。 有更快的方法吗?


当生成随机数的大样本(数组)时,numpy更有效。例如,

1
2
3
4
5
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)

另外,请参阅如何使用Pythons timeit计算代码段以测试性能?关于如何进行计时测试。当您使用time.clock()时,您应该至少尝试多次重复该操作,然后计算平均时间。建议使用timeit进行时序测试。此外,正如其他人在评论中提到的那样,print()生成随机数的时间要长得多,因此您的时序测试主要测量print()的工作速度。相反,你应该做这样的事情:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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,使用random.random_integers一次生成所需的所有值会更有效。 python和numpy都使用Mersenne Twister。更多信息:Python中numpy.random和random.random之间的差异


我写了一个测试程序。它表明完成任务只需1秒钟。所以只要你想要的任何方式,它就不会成为你的瓶颈。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/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))

enter image description here