Hashing散列注意事项
Hashing散列注意事項(xiàng)
Numba支持內(nèi)置功能hash(),只需__hash__()在提供的參數(shù)上調(diào)用成員函數(shù)即可 。這使得添加對新類型的哈希支持變得微不足道,這是因?yàn)閿U(kuò)展APIoverload_method()裝飾器的應(yīng)用程序,需要重載用于為注冊到該類型的__hash__()方法的新類型,計(jì)算哈希值的函數(shù)。例如:
from numba.extending import overload_method
@overload_method(myType, ‘hash’)
def myType_hash_overload(obj):
# implementation details
實(shí)施
Numba哈希函數(shù)的實(shí)現(xiàn),嚴(yán)格遵循Python 3的實(shí)現(xiàn)。唯一的例外是,對于Unicode和字節(jié)(內(nèi)容長于sys.hash_info.cutoff)進(jìn)行哈希,唯一受支持的算法是 siphash24(CPython 3中的默認(rèn)值)。結(jié)果,默認(rèn)條件下,Numba將為所有受支持的類型匹配Python 3哈希值。
Unicode哈希緩存差異
Numba和CPython Unicode字符串內(nèi)部表示形式都有一個(gè)hash 成員,用于緩存字符串的哈希值。總是在計(jì)算散列值之前檢查該成員,并且僅從緩存中提供一個(gè)值就可以了,因?yàn)檫@樣做便宜得多。Numba Unicode字符串哈希緩存實(shí)現(xiàn)的行為與CPython的行為類似。唯一值得注意的行為更改(其唯一影響是性能的潛在變化)是,Numba始終計(jì)算并緩存在將其load,在Python中重用時(shí)創(chuàng)建的Unicode字符串的哈希,與CPython相比,這在某些情況下太快了。CPython可能會延遲根據(jù)創(chuàng)建方法對新Unicode字符串進(jìn)行哈希處理的時(shí)間。還應(yīng)注意,Numba在Unicode字符串復(fù)制nopython modehash 的CPython內(nèi)部表示形式的成員時(shí),將其拆分成其自己的表示形式,不重新計(jì)算已經(jīng)具有與之關(guān)聯(lián)的哈希值的字符串的哈希。
PYTHONHASHSEED的Accommodation
PYTHONHASHSEED環(huán)境變量可用于后續(xù)的CPython的散列算法。例如,Numba哈希實(shí)現(xiàn)直接讀取CPython哈希算法的內(nèi)部狀態(tài),結(jié)果,在Numba的哈希實(shí)現(xiàn)中,PYTHONHASHSEED復(fù)制了。
總結(jié)
以上是生活随笔為你收集整理的Hashing散列注意事项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 适用于CUDA GPU的Numba 随机
- 下一篇: 关于Numba的线程实现的说明