我正在實現一些搜索算法,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 回答

慕的地6264312
TA貢獻1817條經驗 獲得超6個贊
我的回答并不像問的那樣??赡軙o你一些想法。通常,從 numpy 獲得良好性能背后的重要想法是一次分攤解釋器在許多元素上的成本。換句話說,將循環從 python 代碼(慢)移動到 numpy/BLAS/LAPACK/etc 中某處的 C/Fortran 循環中。內部(快速)。如果您在該操作(稱為矢量化)中取得成功,則性能通常會非常好。
當然,您顯然可以通過轉儲 python 解釋器并使用 C++ 來獲得更好的性能。這種方法是否真的成功取決于您在使用 C++ 與 numpy 進行高性能編程方面的表現如何,以及您想要執行的具體操作。
添加回答
舉報
0/150
提交
取消