十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
最近在做的项目重点部分与大量生成随机数有关,维度高达[1700000,10000],需要生成 10 x 30 次左右,这里遇到内存和速度的双重瓶颈,特地研究了一下如何优化随机数。
成都创新互联是一家集网站建设,鼓楼企业网站建设,鼓楼品牌网站建设,网站定制,鼓楼网站建设报价,网络营销,网络优化,鼓楼网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
优化时间测试所需的分析工具在另一篇博客《性能优化系列一:分析工具》中提到。
原生的python中也有随机模块生成 random.randint 和 random.random 等,但是速度非常慢,numpy 速度可以大幅提升。一般都采用numpy生成随机数。
比较常用的就是以上几种。在需要生成大量随机数的情况下,或生成伪随机数的情况下,python 3.7 常用 RandomState 。
直接生成大规模非稀疏矩阵如下,经常遇到 MemoryError 的错误,大概是同时生成多个float64精度的大规模随机矩阵服务器内存不够,而random state 似乎也没提供调整类型的attr,
这时最好使用即使生成即使销毁,仅保留种子作为索引,同样,多个CPU之间共享大规模矩阵涉及到共享内存或数据传输同步较慢的问题,最好也共享seed而不是直接共享矩阵。
ps. 这里注意一般我们设置time.time()为种子时,对于并发性程序是无效的,不要在并发程序中同时定义,建议生成一个seed list 列表再从中取。
这里可以对大规模矩阵进行分片以进行后续的np 乘法,再切片赋值,以时间换内存。这种情况的麻烦在于如果设定随机数种子会导致每个分片的随机数相同。可以利用一个最初seed(爷爷种子)randint生成 一组切片组数的seed(父亲种子),再每次从中取不同的随机数。
在上述切片方法尝试之后,可以解决内存问题。但是时间非常慢,特别是采取s = 1时在standard normal 上调用170万次的时间长达3000s,line search一下搜索了大约100000为切片值仍然太慢。在文档中发现了 BitGenerator 和 Generator ,大约可以提速到原来的 1/3。
除了Numpy和基本模块之外,AES CTR 加密算法生成随机数也很快,但是并不能有比较方便的方式控制每次生成的一样。参见以下reference。
tensorflow 和 pytorch 也都有大规模生成随机tensor的方式。性能待考。
1. 超快生成随机数的方式CSDN博客
2. tensorflow 生成随机tensor
#导入随机数模块
import random
#定义一个空的数组,用作取样表
reList = []
#为取样表赋值,1~100
for i in range(1,101):
reList.append(i)
#使用sample方法,取3个随机数
res = random.sample(reList,k=3)
print("三个随机数是:{}".format(res))
在Python中可以用于随机数生成的有两种主要途径,一是random模块,另一个是numpy库中random函数。
在我们日常使用中,如果是为了得到随机的单个数,多考虑random模块;如果是为了得到随机小数或者整数的矩阵,就多考虑numpy中的random函数,当然numpy也可以的到随机的单个数
一、random模块
二、numpy库中random函数
random模块中将近有7个函数都是可以用来生成随机数的:
作用:随机生成一个 [0,1) 的浮点数
作用:随机生成一个 [a,b) 的浮点数
作用:随机生成一个 [a,b] 的整数
作用:从列表,元组,字符串、集合(可用于for循环的数据类型)中随机选择一个元素
作用:在生成的以a为始,每step递增,以b为终这样的一个整数序列中随机选择一个数
作用:打乱一个列表的元素顺序
从序列population中随机取出k个数;population的类型可以是列表、元组、集合、字符串;
在Numpy库中,常用使用np.random.rand()、np.random.randn()和np.random.randint()随机函数。
作用:返回一个或一组服从标准正态分布的随机样本值
备注:标准正态分布是以0为均数、以1为标准差的正态分布,记为N(0,1)。对应的正态分布曲线如下所示,即
作用:使用方法与np.random.randn()函数相同 ,通过本函数可以返回一个或一组服从“0~1”均匀分布的随机样本值。随机样本取值范围是[0,1),不包括1
numpy.random.randint(low, high=None, size=None, dtype='l')
输入:
low—–为最小值
high—-为最大值
size—–为数组维度大小
dtype—为数据类型,默认的数据类型是np.int。
作用: 返回随机整数或整型数组,范围区间为[low,high),包含low,不包含high; high没有填写时,默认生成随机数的范围是[0,low
np.random.random([size])
作用:生成[0,1)之间的浮点数,与np.random.rand()功能类似
np.random.choice(a,[ size, replace, p])
参考文档1: 【python】numpy之random库简单的随机数据生成.rand()、.randint()、.randn()、.random()等(一)
参考文档2: Python中随机数的生成
参考文档3: numpy.random模块常用函数
终于写完了,我以为它很简单的………………预计1小时,结果写了2.5小时
python中的randint用来生成随机数,在使用randint之前,需要调用random库。其表达是为random.randint(x,y),参数x和y代表生成随机数的区间范围。
random() 函数命名来源于英文单词random(随机)。randint是random + integer拼接简写而成,代表随机一个整数。
Python标准库中的random函数,可以生成随机浮点数、整数、字符串,甚至帮助你随机选择列表序列中的一个元素,打乱一组数据等。
函数randint的使用
1、OUT = RANDINT
产生一个“ 0 ”或“ 1 ”等概率。
2、OUT = RANDINT(M)
生成的M 矩阵的随机二进制数字,“ 0 ”和“ 1 ”出现的概率均等。
3、OUT = RANDINT(M,N)
生成的(M,N) 矩阵的随机二进制数字,“ 0 ”和“ 1 ”出现的概率均等。
4、OUT = RANDINT(M,N,RANGE)
生成的(M,N) 矩阵的随机二进制数字,RANGE范围可以是标量或向量。
标量:为正的话,取值为[0,RANGE-1] ,为负的话,取值为 [RANGE+1, 0]。
向量:取值为[RANGE(1), RANGE(2)]。
5、OUT = RANDINT(M,N,RANGE,STATE)
resets the state of RAND to STATE。
过程如图所示:
获取1~100以内的随机数有两种方法:
方法1:可以通过Math类中的random方法获取随机数,再乘以100加1,然后转换为int类型即可。
方法2:可以通过Random类中的nextInt方法获取随机数。
扩展资料
函数使用补充说明
1、random是用于生成随机数的,可以利用它随机生成数字或者选择字符串。
random.random(),用于生成一个随机浮点数:range[0.0,1.0)。
random.uniform(a,b),用于生成一个指定范围内的随机浮点数,a,b为上下限,只要a!=b,就会生成介于两者之间的一个浮点数,若a=b,则生成的浮点数就是a。
random.randint(a,b),用于生成一个指定范围内的整数,a为下限,b为上限,生成的随机整数a=n=b;若a=b,则n=a;若ab,报错。
random.randrange(, stop [,step]),从指定范围内,按指定基数递增的集合中获取一个随机数,基数缺省值为1。
random.choice(sequence),从序列中获取一个随机元素,参数sequence表示一个有序类型,并不是一种特定类型,泛指list,tuple,字符串等。
random.shuffle(x[,random]),用于将一个列表中的元素打乱。
random.sample(sequence,k),从指定序列中随机获取k个元素作为一个片段返回,sample函数不会修改原有序列。
2、Python中有join()和os.path.join()两个函数,具体作用如下:
join():连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串。
os.path.join():将多个路径组合后返回。