Python之random.sample()和numpy.random.choice()的優(yōu)缺點(diǎn)說明
對比
python中random.sample()方法可以隨機(jī)地從指定列表中提取出N個(gè)不同的元素,列表的維數(shù)沒有限制。
有文章指出:在實(shí)踐中發(fā)現(xiàn),當(dāng)N的值比較大的時(shí)候,該方法執(zhí)行速度很慢。
可以用numpy random模塊中的choice方法來提升隨機(jī)提取的效率。
(有問題,從該文章看不出來random.sample方法比choice方法慢多少,我自己仿真倒是發(fā)現(xiàn)random.sample方法比choice方法快的多,后面會舉例說明)
numpy.random.choice() 對抽樣對象有要求,必須是整數(shù)或者一維數(shù)組(列表),不能對超過一維的數(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ǔ)充
前面說random.sample方法比choice方法快的多,下面附圖為證。
更新
有博友留言說,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)來看,numpy.random.choice()抽樣方法的時(shí)間幾乎不會隨著抽樣數(shù)量的變化而變化,而random.sample() 會隨著抽樣數(shù)量的增加而增加。
所以當(dāng)數(shù)量較少的時(shí)候,random.sample() 用時(shí)非常少,而numpy.random.choice()則很長;當(dāng)抽樣數(shù)量很大的時(shí)候,numpy.random.choice()幾乎不變,而random.sample() 用時(shí)變長。
簡單繪制一下測試結(jié)果,如下所示
從圖上可以看到,numpy.random.choice()的用時(shí)確實(shí)保持不變,而random.sample() 用時(shí)會隨著抽樣比例的增加而線性增長。
總結(jié)
從對象類型上看,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教程十行代碼教你語音轉(zhuǎn)文字QQ微信聊天
QQ上面發(fā)的語音消息是可以直接文字識別的,但是微信為什么沒有呢?是因?yàn)榧夹g(shù)太難實(shí)現(xiàn)嗎?這個(gè)很簡單啊!今天給大家介紹一下語音轉(zhuǎn)文字的原理2021-09-09python實(shí)現(xiàn)websocket的客戶端壓力測試
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)websocket的客戶端壓力測試,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06django rest framework serializer返回時(shí)間自動格式化方法
這篇文章主要介紹了django rest framework serializer返回時(shí)間自動格式化方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Python控制自己的手機(jī)攝像頭拍照并自動發(fā)送到郵箱案例講解
這篇文章主要介紹了Python控制自己的手機(jī)攝像頭拍照,并把照片自動發(fā)送到郵箱,大概思路是通過opencv調(diào)用攝像頭拍照保存圖像本地用email庫構(gòu)造郵件內(nèi)容,保存的圖像以附件形式插入郵件內(nèi)容用smtplib庫發(fā)送郵件到指定郵箱,需要的朋友可以參考下2022-04-04Python實(shí)現(xiàn)跨平臺表格數(shù)據(jù)分頁打印預(yù)覽處理詳解
這篇文章主要為大家詳細(xì)介紹了如何使用PySide6/PyQt6實(shí)現(xiàn)Python跨平臺表格數(shù)據(jù)分頁打印預(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ò)編程,希望對大家有所幫助2024-04-04