在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)
?