Python之random.sample()和numpy.random.choice()的优缺点说明
作者:Javy Wang
对比
python中random.sample()方法可以随机地从指定列表中提取出N个不同的元素,列表的维数没有限制。
有文章指出:在实践中发现,当N的值比较大的时候,该方法执行速度很慢。
可以用numpy random模块中的choice方法来提升随机提取的效率。
(有问题,从该文章看不出来random.sample方法比choice方法慢多少,我自己仿真倒是发现random.sample方法比choice方法快的多,后面会举例说明)
numpy.random.choice() 对抽样对象有要求,必须是整数或者一维数组(列表),不能对超过一维的数据进行抽样,这是其缺点。
random.sample() 和 numpy.random.choice() 的优点都是可以指定抽样的个数,一次性从列表中不重复地抽样出指定个数的元素,其中 random.sample()默认就是不重复抽样(不放回的抽样),而numpy.random.choice()默认是可以重复抽样,要想不重复地抽样,需要设置replace参数为False,用法如下:
补充
前面说random.sample方法比choice方法快的多,下面附图为证。
更新
有博友留言说,numpy.random.choice()与 random.sample() 两者适合的情况不同,建议增加抽样数量再试试,下面是逐步增加抽样数量后的结果。
列表元素为100000个,抽样个数为9。
抽样个数为1000。
抽样个数为10000。
抽样个数为50000。
从以上实验来看,numpy.random.choice()抽样方法的时间几乎不会随着抽样数量的变化而变化,而random.sample() 会随着抽样数量的增加而增加。
所以当数量较少的时候,random.sample() 用时非常少,而numpy.random.choice()则很长;当抽样数量很大的时候,numpy.random.choice()几乎不变,而random.sample() 用时变长。
简单绘制一下测试结果,如下所示
从图上可以看到,numpy.random.choice()的用时确实保持不变,而random.sample() 用时会随着抽样比例的增加而线性增长。
总结
从对象类型上看,random.sample方法比numpy.random.choice方法适用范围广。
从速度上看,当抽样数量小的时候,random.sample方法比numpy.random.choice方法快很多;当抽样数量很大的时候,random.sample方法就不如numpy.random.choice方法了。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。