在Python中创build随机的整数列表

我想为testing目的创build随机列表的整数。 数字的分布并不重要。 计数唯一的是时间 。 我知道生成随机数是一项耗时的工作,但是必须有更好的方法。

这是我目前的解决scheme:

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:样本大于人口

你知道一个快速,有效的解决scheme,在这个规模工作吗?

编辑:

安德鲁的:0.000290962934494

gnibbler's:0.0058455221653

KennyTM:0.00219276118279

NumPy来了,看到了,被征服了

谢谢!

不完全清楚你想要什么,但我会用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到10,000作为评论员指出的 – 如果你真的想要从0到1000,你可以用10)。 如果你真的不关心你得到什么分配,那么你可能不是很了解你的问题,或者随机数字 – 如果这听起来很粗鲁,你可能会道歉。

所有随机方法最终调用random.random()所以最好的方法是直接调用它

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

例如。

random.randint调用random.randrange
random.randrange在返回istart + istep*int(self.random() * n)之前有一堆开销检查范围,

编辑:numpy当然更快了

你关于性能的问题是没有实际意义的 – 这两个function都非常快。 你的代码的速度将取决于你对随机数什么。

然而,重要的是要理解这两个函数的行为差异。 一个是随机抽样replace,另一个抽样没有replace。

首先,你应该使用randrange(0,1000)randint(0,999) ,而不是randint(0,1000)randint上限是包含的。

为了高效, randint只是一个random调用的randrange的包装,所以你应该使用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)