首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中获取介于1到100万之间的随机数的最快方法

在python中获取介于1到100万之间的随机数的最快方法
EN

Stack Overflow用户
提问于 2018-06-11 09:23:30
回答 4查看 3K关注 0票数 1

实现这一目标的绝对最快的方法是什么?我每天会做超过一百万次,所以我想要最大的效率。

使用numpy ( 20次后平均运行0.0001679009692429128次)

代码语言:javascript
复制
t0 = time.clock()
print(np.random.randint(1,1000000))
t1 = time.clock()
print (t1-t0)

随机(平均值: 0.0000920492372555262)

代码语言:javascript
复制
t2 = time.clock()
print(random.choice(range(1,1000000)))
t3 = time.clock()
print (t3-t2)

令我惊讶的是,random总是比numpy快。有没有更快的方法?

EN

回答 4

Stack Overflow用户

发布于 2018-06-11 11:47:19

numpy在生成随机数的大样本(数组)时效率更高。例如,

代码语言:javascript
复制
In [10]: %timeit np.random.randint(1,1000000, 1000000)
5.14 ms ± 64.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [11]: %timeit [random.choice(range(1,1000000)) for _ in range(1000000)]
1.01 s ± 14.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

此外,有关如何执行计时测试的信息,请参阅How can I time a code segment for testing performance with Pythons timeit?。当您使用time.clock()时,您至少应该尝试多次重复该操作,然后计算平均时间。更可取的做法是使用timeit进行定时测试。此外,正如其他人在评论中提到的那样,print()比随机数生成花费的时间要长得多,所以您的计时测试主要是测量print()的工作速度。相反,您应该这样做:

代码语言:javascript
复制
In [12]: repeat = 1000000
    ...: t0 = time.clock()
    ...: for _ in range(repeat):
    ...:     np.random.randint(1, 1000000)
    ...: t1 = time.clock()
    ...: print((t1 - t0) / repeat)
1.3564629999999908e-06

In [13]: repeat = 1000000
    ...: t2 = time.clock()
    ...: for _ in range(repeat):
    ...:     random.choice(range(1, 1000000))
    ...: t3 = time.clock()
    ...: print((t3 - t2) / repeat)
1.0206699999999956e-06

因此,对于单个数字,numpy平均只比内置随机数生成器慢大约35%。然而,之前的测试表明,在生成大样本时,numpy的速度要快得多。

票数 3
EN

Stack Overflow用户

发布于 2018-06-11 11:21:38

我写了一个测试程序。它显示完成您的任务只需要1秒。所以,你想怎么写就怎么写吧,它不会成为你的瓶颈。

代码语言:javascript
复制
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Xiang Wang @ 2018-05-23 16:49:00

import time
import random

start = time.time()

for i in range(1000000):
    random.randint(1, 1000000)

end = time.time()

print("total time: {}".format(end-start))

票数 1
EN

Stack Overflow用户

发布于 2018-06-11 11:46:35

如果您使用的是numpy,那么使用random.random_integers一次性生成所需的所有值会更有效。python和numpy都使用Mersenne Twister。更多信息:Differences between numpy.random and random.random in Python

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50789448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档