Python之random.sample()和numpy.random.choice()的優(yōu)缺點(diǎn)說(shuō)明
對(duì)比
python中random.sample()方法可以隨機(jī)地從指定列表中提取出N個(gè)不同的元素,列表的維數(shù)沒(méi)有限制。
有文章指出:在實(shí)踐中發(fā)現(xiàn),當(dāng)N的值比較大的時(shí)候,該方法執(zhí)行速度很慢。
可以用numpy random模塊中的choice方法來(lái)提升隨機(jī)提取的效率。
(有問(wèn)題,從該文章看不出來(lái)random.sample方法比choice方法慢多少,我自己仿真倒是發(fā)現(xiàn)random.sample方法比choice方法快的多,后面會(huì)舉例說(shuō)明)
numpy.random.choice() 對(duì)抽樣對(duì)象有要求,必須是整數(shù)或者一維數(shù)組(列表),不能對(duì)超過(guò)一維的數(shù)據(jù)進(jìn)行抽樣,這是其缺點(diǎn)。
random.sample() 和 numpy.random.choice() 的優(yōu)點(diǎn)都是可以指定抽樣的個(gè)數(shù),一次性從列表中不重復(fù)地抽樣出指定個(gè)數(shù)的元素,其中 random.sample()默認(rèn)就是不重復(fù)抽樣(不放回的抽樣),而numpy.random.choice()默認(rèn)是可以重復(fù)抽樣,要想不重復(fù)地抽樣,需要設(shè)置replace參數(shù)為False,用法如下:
補(bǔ)充
前面說(shuō)random.sample方法比choice方法快的多,下面附圖為證。
更新
有博友留言說(shuō),numpy.random.choice()與 random.sample() 兩者適合的情況不同,建議增加抽樣數(shù)量再試試,下面是逐步增加抽樣數(shù)量后的結(jié)果。
列表元素為100000個(gè),抽樣個(gè)數(shù)為9。
抽樣個(gè)數(shù)為1000。
抽樣個(gè)數(shù)為10000。
抽樣個(gè)數(shù)為50000。
從以上實(shí)驗(yàn)來(lái)看,numpy.random.choice()抽樣方法的時(shí)間幾乎不會(huì)隨著抽樣數(shù)量的變化而變化,而random.sample() 會(huì)隨著抽樣數(shù)量的增加而增加。
所以當(dāng)數(shù)量較少的時(shí)候,random.sample() 用時(shí)非常少,而numpy.random.choice()則很長(zhǎng);當(dāng)抽樣數(shù)量很大的時(shí)候,numpy.random.choice()幾乎不變,而random.sample() 用時(shí)變長(zhǎng)。
簡(jiǎn)單繪制一下測(cè)試結(jié)果,如下所示
從圖上可以看到,numpy.random.choice()的用時(shí)確實(shí)保持不變,而random.sample() 用時(shí)會(huì)隨著抽樣比例的增加而線性增長(zhǎng)。
總結(jié)
從對(duì)象類型上看,random.sample方法比numpy.random.choice方法適用范圍廣。
從速度上看,當(dāng)抽樣數(shù)量小的時(shí)候,random.sample方法比numpy.random.choice方法快很多;當(dāng)抽樣數(shù)量很大的時(shí)候,random.sample方法就不如numpy.random.choice方法了。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python如何用matplotlib創(chuàng)建三維圖表
這篇文章主要介紹了python如何在matplotlib中創(chuàng)建三維圖表,幫助大家更好的利用python進(jìn)行數(shù)據(jù)分析,感興趣的朋友可以了解下2021-01-01python教程十行代碼教你語(yǔ)音轉(zhuǎn)文字QQ微信聊天
QQ上面發(fā)的語(yǔ)音消息是可以直接文字識(shí)別的,但是微信為什么沒(méi)有呢?是因?yàn)榧夹g(shù)太難實(shí)現(xiàn)嗎?這個(gè)很簡(jiǎn)單?。〗裉旖o大家介紹一下語(yǔ)音轉(zhuǎn)文字的原理2021-09-09Python?print函數(shù):如何將對(duì)象打印輸出
這篇文章主要介紹了Python?print函數(shù):如何將對(duì)象打印輸出,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05python實(shí)現(xiàn)websocket的客戶端壓力測(cè)試
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)websocket的客戶端壓力測(cè)試,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06django rest framework serializer返回時(shí)間自動(dòng)格式化方法
這篇文章主要介紹了django rest framework serializer返回時(shí)間自動(dòng)格式化方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Python控制自己的手機(jī)攝像頭拍照并自動(dòng)發(fā)送到郵箱案例講解
這篇文章主要介紹了Python控制自己的手機(jī)攝像頭拍照,并把照片自動(dòng)發(fā)送到郵箱,大概思路是通過(guò)opencv調(diào)用攝像頭拍照保存圖像本地用email庫(kù)構(gòu)造郵件內(nèi)容,保存的圖像以附件形式插入郵件內(nèi)容用smtplib庫(kù)發(fā)送郵件到指定郵箱,需要的朋友可以參考下2022-04-04Python實(shí)現(xiàn)跨平臺(tái)表格數(shù)據(jù)分頁(yè)打印預(yù)覽處理詳解
這篇文章主要為大家詳細(xì)介紹了如何使用PySide6/PyQt6實(shí)現(xiàn)Python跨平臺(tái)表格數(shù)據(jù)分頁(yè)打印預(yù)覽處理,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03Python網(wǎng)絡(luò)編程之Socket和HTTP協(xié)議詳解
在當(dāng)今互聯(lián)網(wǎng)時(shí)代,網(wǎng)絡(luò)編程是程序員不可或缺的一項(xiàng)技能,本文將介紹Python中兩種主要的網(wǎng)絡(luò)編程方式:Socket編程和基于HTTP協(xié)議的網(wǎng)絡(luò)編程,希望對(duì)大家有所幫助2024-04-04