亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么python`in`比`np.isin`快得多

為什么python`in`比`np.isin`快得多

HUWWW 2021-08-24 19:05:54
我正在實現一些搜索算法,numpy其中一個步驟是檢查向量在矩陣中的天氣(作為行)。以前用過np.isin,突然好奇python關鍵字in能不能用。因此,我對其進行了測試并發現它確實有效。由于我沒有找到任何 python 接口in(如__add__for+或__abs__for abs),我相信它in是通過使用標準迭代器邏輯在 python 中硬連接的,因此與numpy-provided相比它應該更慢np.isin。但在我做了一些測試之后,令人難以置信的是:>>> a = np.int8(1)>>> A = np.zeros(2**24, 'b')>>> %timeit a in A>>> %timeit np.isin(a, A)21.7 ms ± 1.58 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)310 ms ± 20.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)對于小數據類型,saisnp.isin比 python 慢 10 倍以上in。我也做了大數據類型的測試>>> a = np.ones(1, 'V256')>>> A = np.zeros(2**22, 'V256')>>> %timeit a in A>>> %timeit np.isin(a, A)129 ms ± 12.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)10.5 s ± 184 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)saisnp.isin慢了大約 100 倍。我想知道這可能是什么原因。請注意,由于a=1while A=[0,0,...],必須在整個數組上進行匹配。在python方面沒有“提前退出”這樣的事情。編輯哦實際上有被in調用的python接口__contains__。但是為什么會np.isin比np.ndarray.__contains__?
查看完整描述

2 回答

?
嗶嗶one

TA貢獻1854條經驗 獲得超8個贊

numpy.ndarray.__contains__基本上只是(elem == arr).any()(即使這沒有意義)。您可以查看源代碼,它對于 NumPy C 例程來說非常簡短和簡單。

numpy.isin在其左操作數上廣播,并針對廣播情況下的效率進行了優化。對于較小的左操作數,它將使用基于排序的方法,這對于標量來說太過分了。對于左操作數是標量,或者左手是一個足夠小的數組,排序比簡單的方法更昂貴,它目前沒有快速路徑。


查看完整回答
反對 回復 2021-08-24
?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

我的回答并不像問的那樣??赡軙o你一些想法。通常,從 numpy 獲得良好性能背后的重要想法是一次分攤解釋器在許多元素上的成本。換句話說,將循環從 python 代碼(慢)移動到 numpy/BLAS/LAPACK/etc 中某處的 C/Fortran 循環中。內部(快速)。如果您在該操作(稱為矢量化)中取得成功,則性能通常會非常好。

當然,您顯然可以通過轉儲 python 解釋器并使用 C++ 來獲得更好的性能。這種方法是否真的成功取決于您在使用 C++ 與 numpy 進行高性能編程方面的表現如何,以及您想要執行的具體操作。


查看完整回答
反對 回復 2021-08-24
  • 2 回答
  • 0 關注
  • 586 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號