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

Sti*_*ggo 68 python random performance list

我想为测试目的创建一个随机的整数列表.数字的分布并不重要.唯一重要的是时间.我知道生成随机数是一项耗时的任务,但必须有更好的方法.

这是我目前的解决方案:

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
Run Code Online (Sandbox Code Playgroud)

v2比v1快,但它的工作规模不大.它给出以下错误:

ValueError:大于人口的样本

是否有一个快速,有效的解决方案,以这种规模工作?

一些结果来自答案

安德鲁:0.000290962934494

gnibbler's:0.0058455221653

KennyTM's:0.00219276118279

NumPy来了,看到并征服了.

And*_*ffe 60

目前还不完全清楚你想要什么,但我会使用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
Run Code Online (Sandbox Code Playgroud)

这给我的机器:

0.0233682730198
0.00781716918945
0.000147947072983
Run Code Online (Sandbox Code Playgroud)

请注意,randint 与random.sample 非常不同(为了让它在你的情况下工作,我必须将其改为1000到10,000,正如评论员指出的那样 - 如果你真的希望它们从0到1,000你可以除以10).

如果你真的不在乎你正在获得什么样的分布,那么你可能要么不能很好地理解你的问题,要么随机数字 - 如果这听起来很粗鲁就道歉......

  • numpy为+1,如果Stiggo需要这么多随机数,那么可能值得为此安装numpy (3认同)

Joh*_*ooy 30

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

[int(1000*random.random()) for i in xrange(10000)]
Run Code Online (Sandbox Code Playgroud)

例如,

  • random.randint电话random.randrange.
  • random.randrange在返回之前有一堆开销来检查范围istart + istep*int(self.random() * n).

NumPy当然要快得多.

  • 在Python3中,random.randrange(1000)被设计为产生比random.random()*1000更均匀的分布.请参见此处的9.6.2节:https://docs.python.org/3/library/random.html (4认同)

Col*_*nic 5

关于性能的问题没有实际意义 - 两种功能都非常快.你的代码的速度由你什么来决定与随机数.

但是,了解这两个函数的行为差异非常重要.一个是随机抽样替换,另一个是随机抽样而无需替换.