在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: sample larger than population
有没有一种快速有效的方法可以处理这么大的数据量呢?
一些答案的结果
Andrew的结果: 0.000290962934494
gnibbler的结果: 0.0058455221653
KennyTM的结果: 0.00219276118279
NumPy出现了,解决了问题。
4 个回答
6
你问的关于性能的问题其实没什么意义——这两个函数都非常快。你的代码速度主要取决于你对随机数的使用方式。
不过,了解这两个函数的行为差异是很重要的。一个是带替换的随机抽样,另一个是无替换的随机抽样。
34
所有的随机方法最后都会调用 random.random()
,所以最好的办法就是直接调用它:
[int(1000*random.random()) for i in xrange(10000)]
举个例子,
random.randint
会调用random.randrange
。random.randrange
在返回istart + istep*int(self.random() * n)
之前,需要做很多额外的检查。
当然,NumPy 运行起来会更快。
63
你想要的内容不是很清楚,但我会使用 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 是 非常 不一样的。为了让它在你的情况下正常工作,我不得不把1,000改成10,000,正如有位评论者指出的那样——如果你真的想要从0到1,000的数字,你可以把结果除以10。
如果你真的不在乎得到什么样的分布,那可能是你对自己的问题理解得不够透彻,或者对随机数的理解不够——如果这样说让你觉得不舒服,我表示歉意……