我写了一个方法来生成缓存键来缓存函数结果,这个键是基于函数名和散列值相结合的参数。在
目前我正在使用hashlib来散列参数的序列化版本,但是序列化大型对象的操作非常昂贵,那么还有什么替代方法呢?在
#get the cache key for storage
def cache_get_key(*args):
import hashlib
serialise = []
for arg in args:
serialise.append(str(arg))
key = hashlib.md5("".join(serialise)).hexdigest()
return key
更新: 我尝试过使用hash(str(args)),但如果arg中包含相对较大的数据,则仍然需要很长时间来计算哈希值。有更好的方法吗?在
实际上,str(args)与大数据需要永远。。。在
或者(如果您真的想使用hashlib库)
^{pr2}$我不会费心重写代码来将数组变成字符串。使用内置的那个。在
替代方案
以下是8bitwide建议的解决方案。这个解决方案根本不需要哈希!在
你试过使用
hash
函数吗?它在元组上工作得非常好。在假设您创建了对象,并且它由更小的组件组成(它不是二进制blob),那么您可以在构建对象时使用其子组件的哈希来预计算哈希。在
例如,不是
serialize(repr(arg))
,而是arg.precomputedHash if isinstance(arg, ...) else serialize(repr(arg))
如果既不创建自己的对象,也不使用
hash
的对象,则可以保留一个objectreferences->;散列的memoization表,前提是不改变对象。最坏的情况是,您可以使用允许记忆的函数式语言,因为这样一种语言中的所有对象都可能是不可变的,因此是可散列的。在相关问题 更多 >
编程相关推荐