首页 / PYTHON / python-生成大量随机变量
python-生成大量随机变量
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-生成大量随机变量,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3698字,纯文字阅读大概需要6分钟。
内容图文
![python-生成大量随机变量](/upload/InfoBanner/zyjiaocheng/667/1dc6bf2b87764bdd92d4aa83ba703f98.jpg)
我正在尝试找出在python中生成许多随机数的最佳方法.困难的部分是,在运行时之前,我将不知道需要多少个数字
我有一个程序,一次使用一个随机数,但它需要执行多次.
到目前为止,我尝试过的事情是:
>使用random.random()一次生成一个随机数
>使用np.random.rand()一次生成一个随机数
>使用np.random.rand(N)在一批N中生成随机数
>使用np.random.rand(N)在N的批次中生成随机数,并在使用完第一个N后进行新的批次(我尝试了两种不同的实现,两者都比仅在生成一个数时要慢一次)
在下面的脚本中,我比较了这三种方法的前三种(对于统一和正态分布的随机数).
我不知道p函数是否真的必要,但是我想在每种情况下都用随机数做等效的事情,这似乎是最简单的方法.
#!/bin/python3
import time
import random
import numpy as np
def p(x):
pass
def gRand(n):
for i in range(n):
p(random.gauss(0,1))
def gRandnp1(n):
for i in range(n):
p(np.random.randn())
def gRandnpN(n):
rr=np.random.randn(n)
for i in rr:
p(i)
def uRand(n):
for i in range(n):
p(random.random())
def uRandnp1(n):
for i in range(n):
p(np.random.rand())
def uRandnpN(n):
rr=np.random.rand(n)
for i in rr:
p(i)
tStart=[]
tEnd=[]
N=1000000
for f in [uRand, uRandnp1, uRandnpN]:
tStart.append(time.time())
f(N)
tEnd.append(time.time())
for f in [gRand, gRandnp1, gRandnpN]:
tStart.append(time.time())
f(N)
tEnd.append(time.time())
print(np.array(tEnd)-np.array(tStart))
此计时脚本输出的代表性示例是:
[0.26499939 0.45400381 0.19900227 1.57501364 0.49000382 0.23000193]
前三个数字用于[0,1)上的统一随机数,后三个数字用于正态分布的数字(mu = 0,sigma = 1).
对于这两种类型的随机变量,最快的方法(这三种方法)是一次生成所有随机数,将它们存储在数组中,然后遍历数组.问题是直到运行程序后,我才知道需要多少这些数字.
我想做的是大批量生成随机数.然后,当我在一批中使用所有数字时,我将重新填充存储它们的对象.问题是我不知道实现此目标的干净方法.我想到的一种解决方案是:
N=1000000
numRepop=4
N1=N//numRepop
__rands__=[]
irand=-1
def repop():
global __rands__
__rands__=np.random.rand(N1)
repop()
def myRand():
global irand
try:
irand += 1
return __rands__[irand]
except:
irand=1
repop()
return __rands__[0]
但这实际上比其他任何选项都要慢.
如果我将numpy数组转换为列表,然后弹出元素,则获得的性能类似于仅使用numpy一次生成一个随机变量:
__r2__=[]
def repop2():
global __r2__
rr=np.random.rand(N1)
__r2__=rr.tolist()
repop2()
def myRandb():
try:
return __r2__.pop()
except:
repop2()
return __r2__.pop()
有一个更好的方法吗?
编辑:“更好”,我的意思是更快.我也希望使用确定性(伪)随机数
解决方法:
如果一次生成大量数字的速度更快,则可以使用生成器来缓存批次.这适用于python 3.5
def randoms(batchsize=10000):
while True:
yield from numpy.random.rand(batchsize)
不知道它是否比您的其他实现更快,但这是一个永无止境的生成器.
您可以像使用任何迭代器一样使用它:
prng = randoms()
for _ in range(1000000):
foo(next(prng))
或这样(但循环永远不会退出):
for x in randoms():
foo(x)
编辑:
我试图自己对此进行基准测试,我认为差异主要是由于python中函数调用的额外开销.我试图通过在所有情况下遍历一个范围来使基准更具有可比性,并且使用预生成数组的优势较小.
通过使用微优化技巧,将numpy.random.rand分配给局部变量,我获得了几乎相同的速度,这大大加快了函数调用的速度.
我还包括生成器方法进行比较.
def randoms(batchsize):
rand = numpy.random.rand
while True:
yield from rand(batchsize)
?
def test_generator(times):
rand = randoms(1000).__next__
for n in range(times):
rand()
def test_rand(times):
for n in range(times):
numpy.random.rand()
def test_rand_micro_opt(times):
rand = numpy.random.rand
for n in range(times):
rand()
def test_array(times):
array = numpy.random.rand(times)
for n in range(times):
array[n]
?
# ipython / jupyter magic %timeit command
%timeit -n 1000 test_generator(10000)
%timeit -n 1000 test_rand(10000)
%timeit -n 1000 test_rand_micro_opt(10000)
%timeit -n 1000 test_array(10000)
?
1000 loops, best of 3: 2.09 ms per loop
1000 loops, best of 3: 2.93 ms per loop
1000 loops, best of 3: 1.74 ms per loop
1000 loops, best of 3: 1.57 ms per loop
内容总结
以上是互联网集市为您收集整理的python-生成大量随机变量全部内容,希望文章能够帮你解决python-生成大量随机变量所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。