热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python输出多个随机数_python生成大量随机变量

我正在尝试找出在python中生成许多随机数的最佳方法.困难的部分是,在运行时之前,我将不知道需要多少个数字我有一个程序,一次使用一个随机数,但它需要执行多次.到目前为止,我尝

我正在尝试找出在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

标签:performance,random,python,numpy

来源: https://codeday.me/bug/20191111/2022351.html



推荐阅读
  • 很多时候在注册一些比较重要的帐号,或者使用一些比较重要的接口的时候,需要使用到随机字符串,为了方便,我们设计这个脚本需要注意 ... [详细]
  • 假设我有两个数组A和B,其中A和B都是mxn.我现在的目标是,对于A和B的每一行,找到我应该在B的相应行中插入A的第i行元素的位置.也就是说,我希望将np.digitize或np. ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • Python教学练习二Python1-12练习二一、判断季节用户输入月份,判断这个月是哪个季节?3,4,5月----春 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
  • 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 2.对于随机访问get和set,ArrayList优于LinkedList,因为Ar ... [详细]
  • 关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习P ... [详细]
author-avatar
我思故我在
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有