在 Python 中创建随机整数列表

我想创建一个随机的整数列表,以便进行测试。数字的分布并不重要。唯一在计数的是 时间。我知道生成随机数是一项耗时的工作,但肯定有更好的方法。

以下是我目前的解决方案:

import random
import timeit


# Random lists from [0-999] interval
print [random.randint(0, 1000) for r in xrange(10)] # v1
print [random.choice([i for i in xrange(1000)]) for r in xrange(10)] # v2


# Measurement:
t1 = timeit.Timer('[random.randint(0, 1000) for r in xrange(10000)]', 'import random') # v1
t2 = timeit.Timer('random.sample(range(1000), 10000)', 'import random') # v2


print t1.timeit(1000)/1000
print t2.timeit(1000)/1000

V2的速度比 v1快,但是它不能在如此大的范围内工作。它会产生以下错误:

ValueError: 样本大于总体

在这种规模下,有没有一种快速、有效的解决方案?

答案的一些结果

安德鲁的: 0.000290962934494

0.0058455221653

KennyTM’s: 0.00219276118279

笨蛋来了,看到了,征服了。

160735 次浏览

您想要什么并不完全清楚,但我会使用 Numpy Random Randint:

import numpy.random as nprnd
import timeit


t1 = timeit.Timer('[random.randint(0, 1000) for r in xrange(10000)]', 'import random') # v1


### Change v2 so that it picks numbers in (0, 10000) and thus runs...
t2 = timeit.Timer('random.sample(range(10000), 10000)', 'import random') # v2
t3 = timeit.Timer('nprnd.randint(1000, size=10000)', 'import numpy.random as nprnd') # v3


print t1.timeit(1000)/1000
print t2.timeit(1000)/1000
print t3.timeit(1000)/1000

我的机器就不行了:

0.0233682730198
0.00781716918945
0.000147947072983

请注意,randint 是 非常不同于 Random.sample (为了让它在你的例子中起作用,我不得不将1000改为10000,正如一位评论员指出的那样——如果你真的想让它们从0变为1000,你可以除以10)。

如果你真的不在乎你得到的是什么分布,那么有可能你要么没有很好地理解你的问题,或者随机数——如果这听起来很粗鲁,请道歉..。

所有随机方法最终都会调用 random.random(),因此最好的方法是直接调用它:

[int(1000*random.random()) for i in xrange(10000)]

比如说,

  • random.randint呼叫 random.randrange
  • 在返回 istart + istep*int(self.random() * n)之前,random.randrange有许多开销来检查范围。

当然,NumPy 还要快得多。

首先,你应该使用 randrange(0,1000)或者 randint(0,999),而不是 randint(0,1000)randint的上限是包括在内的。

为了提高效率,randint只是调用 randomrandrange的包装器,因此您应该只使用 random。另外,使用 xrange作为 sample的参数,而不是 range

你可以用

[a for a in sample(xrange(1000),1000) for _ in range(10000/1000)]

使用 sample产生10次范围内的10,000个数字。

(当然,这不会打败 NumPy。)

$ python2.7 -m timeit -s 'from random import randrange' '[randrange(1000) for _ in xrange(10000)]'
10 loops, best of 3: 26.1 msec per loop


$ python2.7 -m timeit -s 'from random import sample' '[a%1000 for a in sample(xrange(10000),10000)]'
100 loops, best of 3: 18.4 msec per loop


$ python2.7 -m timeit -s 'from random import random' '[int(1000*random()) for _ in xrange(10000)]'
100 loops, best of 3: 9.24 msec per loop


$ python2.7 -m timeit -s 'from random import sample' '[a for a in sample(xrange(1000),1000) for _ in range(10000/1000)]'
100 loops, best of 3: 3.79 msec per loop


$ python2.7 -m timeit -s 'from random import shuffle
> def samplefull(x):
>   a = range(x)
>   shuffle(a)
>   return a' '[a for a in samplefull(1000) for _ in xrange(10000/1000)]'
100 loops, best of 3: 3.16 msec per loop


$ python2.7 -m timeit -s 'from numpy.random import randint' 'randint(1000, size=10000)'
1000 loops, best of 3: 363 usec per loop

但既然你不关心数字的分布,为什么不用:

range(1000)*(10000/1000)

你关于性能的问题是没有意义的ーー这两个函数都非常快。你的代码的速度将取决于你的 与随机数。

然而,了解这两个函数在 行为中的区别是非常重要的。一种是随机抽样换算,另一种是随机抽样不换算。