【发布时间】:2011-05-09 11:57:56
【问题描述】:
出于测试目的,我想创建一个随机整数列表。数字的分布并不重要。唯一重要的是时间。我知道生成随机数是一项耗时的任务,但一定有更好的方法。
这是我目前的解决方案:
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 的:0.00219276118279
NumPy 出现、看到并征服了。
【问题讨论】:
-
当然不行。
random.sample()耗尽人口,使数字越来越随机。一旦整个种群被耗尽,就不可能进一步抽样。 -
你说是测试用的,测试需要多长时间?
-
对于需要时间(但不需要加密和安全性)的模拟,通常使用Linear Congruential Generator (LCG)。我相信Mersenne Twister 很快(但比 LCG 慢),如果我没记错的话,它提供了均匀的分布。
标签: python list random performance