实现这一目标的绝对最快方式是什么?我每天要这样做超过100万次,所以我想要最大的效率。
numpy(20次运行后平均值0.0001679009692429128)
t0 = time.clock()
print(np.random.randint(1,1000000))
t1 = time.clock()
print (t1-t0)
随机(平均值:0.0000920492372555262)
t2 = time.clock()
print(random.choice(range(1,1000000)))
t3 = time.clock()
print (t3-t2)
令我惊讶的是,随机的速度始终比numpy快。有更快的方法吗?
答案 0 :(得分:3)
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)
此外,请参阅How can I time a code segment for testing performance with Pythons timeit?有关如何执行时序测试的信息。当您使用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
明显更快。
答案 1 :(得分: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))
答案 2 :(得分:1)
如果您正在使用numpy,使用random.random_integers
一次生成所需的所有值会更有效。 python和numpy都使用Mersenne Twister。更多信息:Differences between numpy.random and random.random in Python
答案 3 :(得分:0)
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)
阅读本文了解更多信息: https://eli.thegreenplace.net/2018/slow-and-fast-methods-for-generating-random-integers-in-python/