在Python中创建随机整数列表

74 投票
4 回答
162295 浏览
提问于 2025-04-16 07:01

我想创建一个随机整数列表,用来测试。数字的分布情况并不重要,最重要的是时间。我知道生成随机数是个耗时的工作,但应该有更好的方法。

这是我现在的解决方案:

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。

如果你真的不在乎得到什么样的分布,那可能是你对自己的问题理解得不够透彻,或者对随机数的理解不够——如果这样说让你觉得不舒服,我表示歉意……

撰写回答