在python2.7中,我成功地使用hash()
将对象放入持久存储在磁盘上的存储桶中。模型代码如下所示:
class PersistentDict(object):
def __setitem__(self, key, value):
bucket_index = (hash(key)&0xffffffff) % self.bucket_count
self._store_to_bucket(bucket_index, key, value)
def __getitem__(self, key):
bucket_index = (hash(key)&0xffffffff) % self.bucket_count
return self._fetch_from_bucket(bucket_index)[key]
在python3中,hash()
使用随机或固定的盐,这使得它不可用/次优。显然,不可能使用fixed salt for specific invocations。所以,我需要另一种选择:
dict
/set
支持的对象)我已经尝试过使用hashlib(慢!)以及来自zlib的校验和(显然不适合散列,但meh)可以很好地处理字符串/字节。然而,它们只在字节类对象上工作,而hash()
几乎可以处理所有的对象。在
[1]使用hash()
来标识存储桶是:
PersistentDict
,则不可用
我已经成功地使用了}的组合。最直接的实现方法是:
hash
和{在Python3.4.3中,这比调用plain
hash
慢得多,这大约需要0.07 usec。对于常规对象,hashkey
取而代之的是~1.0 usec。0.8用于bytes
,0.7用于str
。在管理费用大致如下:
isinstance
选择哈希函数zlib.adler32
或zlib.crc32
vshash
:~0.160 usec vs~0.75 usec(adler和crc为+/-4 usec)str
对象("foobar"
)的obj.encode()
datetime.datetime
对象的str(obj).encode()
使用最大的优化来自于
^{pr2}$if
语句的排序。如果一个人最希望看到的是普通物体,以下是我能想到的最快的方法:总时间:
str
和bytes
使用~0.7,对于datetime
非常糟糕,dict
对象、int等使用0.35 usec。如果一个人分别对dict
键(也称为类型)使用显式检查(即不是obj.__class__ in hashkey.dict_types
而是obj.__class__ in hashkey.explicit_dict_types
)。在其他注意事项:
hash
对于使用默认__hash__
实现(包括None
)的任何对象,在解释器启动期间都不稳定(1, 2, 'three')
)的不可变容器(定义__hash__
)来说,它不能正常工作相关问题 更多 >
编程相关推荐