Hashing散列注意事项
Numba支持内置功能hash(),只需__hash__()在提供的参数上调用成员函数即可 。这使得添加对新类型的哈希支持变得微不足道,这是因为扩展APIoverload_method()装饰器的应用程序,需要重载用于为注册到该类型的__hash__()方法的新类型,计算哈希值的函数。例如:
from numba.extending import overload_method
@overload_method(myType, '__hash__')
def myType_hash_overload(obj):
# implementation details
实施
Numba哈希函数的实现,严格遵循Python 3的实现。唯一的例外是,对于Unicode和字节(内容长于sys.hash_info.cutoff)进行哈希,唯一受支持的算法是 siphash24(CPython 3中的默认值)。结果,默认条件下,Numba将为所有受支持的类型匹配Python 3哈希值。
Unicode哈希缓存差异
Numba和CPython Unicode字符串内部表示形式都有一个hash 成员,用于缓存字符串的哈希值。总是在计算散列值之前检查该成员,并且仅从缓存中提供一个值就可以了,因为这样做便宜得多。Numba Unicode字符串哈希缓存实现的行为与CPython的行为类似。唯一值得注意的行为更改(其唯一影响是性能的潜在变化)是,Numba始终计算并缓存在将其load,在Python中重用时创建的Unicode字符串的哈希,与CPython相比,这在某些情况下太快了。CPython可能会延迟根据创建方法对新Unicode字符串进行哈希处理的时间。还应注意,Numba在Unicode字符串复制nopython modehash 的CPython内部表示形式的成员时,将其拆分成其自己的表示形式,不重新计算已经具有与之关联的哈希值的字符串的哈希。
PYTHONHASHSEED的Accommodation
PYTHONHASHSEED环境变量可用于后续的CPython的散列算法。例如,Numba哈希实现直接读取CPython哈希算法的内部状态,结果,在Numba的哈希实现中,PYTHONHASHSEED复制了。