热门标签 | 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



推荐阅读
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • python的交互模式怎么输出名文汉字[python常见问题]
    在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>,此时我们可以使用print() ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • 本文总结了汇编语言中第五至第八章的关键知识点,涵盖间接寻址、指令格式、安全编程空间、逻辑运算指令及数据重复定义等内容。通过详细解析这些内容,帮助读者更好地理解和应用汇编语言的高级特性。 ... [详细]
  • 本文介绍了在安装或运行 Python 项目时遇到的 'ModuleNotFoundError: No module named setuptools_rust' 错误,并提供了解决方案。 ... [详细]
  • 本文详细介绍了如何使用Python编写爬虫程序,从豆瓣电影Top250页面抓取电影信息。文章涵盖了从基础的网页请求到处理反爬虫机制,再到多页数据抓取的全过程,并提供了完整的代码示例。 ... [详细]
  • 本文介绍如何使用 Python 编写程序,检查给定列表中的元素是否形成交替峰值模式。我们将探讨两种不同的方法来实现这一目标,并提供详细的代码示例。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • ThinkPHP框架中处理JS和CSS缓存问题的解决方案
    本文探讨了在ThinkPHP框架中,当启用调试模式(APP_DEBUG)时,删除public文件夹中的CSS和JS文件后页面仍然显示旧样式的问题,并提供了一种有效的解决方法。 ... [详细]
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社区 版权所有