Python 酸洗过程是确定的吗?

Python 酸洗过程是确定的吗?,python,pickle,memoization,Python,Pickle,Memoization,Pickle是否总是为某个输入值生成相同的输出?我想当酸洗内容相同但插入/删除历史记录不同的词典时,可能会出现问题。我的目标是使用Pickle和SHA1为memoize实现创建函数参数的“签名”。相同的输出是什么意思?通常,对于往返(pickling->unpickling),您应该始终获得相同的输出,但我认为序列化格式本身并不能保证在所有情况下都是相同的。当然,它可能会在平台之间发生变化 在您的程序运行的一次内,使用酸洗进行记忆应该是很好的-我已经多次使用此方案,没有遇到任何问题,但这是针对非

Pickle是否总是为某个输入值生成相同的输出?我想当酸洗内容相同但插入/删除历史记录不同的词典时,可能会出现问题。我的目标是使用Pickle和SHA1为memoize实现创建函数参数的“签名”。

相同的输出是什么意思?通常,对于往返(pickling->unpickling),您应该始终获得相同的输出,但我认为序列化格式本身并不能保证在所有情况下都是相同的。当然,它可能会在平台之间发生变化

在您的程序运行的一次内,使用酸洗进行记忆应该是很好的-我已经多次使用此方案,没有遇到任何问题,但这是针对非常简单的问题。一个问题是,这并没有涵盖所有有用的情况(我想到的是函数:您无法对它们进行pickle处理,所以如果您的函数采用可调用的参数,这将不起作用)

我想当酸洗内容相同但插入/删除历史记录不同的词典时,可能会出现问题

对:

>>> pickle.dumps({1: 0, 9: 0}) == pickle.dumps({9: 0, 1: 0})
False
另见:

我的目标是使用Pickle和SHA1为memoize实现创建函数参数的“签名”

这有很多基本问题。不可能想出一个映射相等的对象到字符串的转换,请考虑对象标识的问题:

>>> a = object()
>>> b = object()
>>> a == b
False
>>> pickle.dumps(b) == pickle.dumps(a)
True
根据您的具体需求,您可以将对象层次结构转换为可以散列的层次结构:

def hashablize(obj):
    """Convert a container hierarchy into one that can be hashed.
    
    Don't use this with recursive structures!
    Also, this won't be useful if you pass dictionaries with
    keys that don't have a total order.
    Actually, maybe you're best off not using this function at all."""
    try:
        hash(obj)
    except TypeError:
        if isinstance(obj, dict):
            return tuple((k, hashablize(v)) for (k, v) in sorted(obj.iteritems()))
        elif hasattr(obj, '__iter__'):
            return tuple(hashablize(o) for o in obj)
        else:
            raise TypeError("Can't hashablize object of type %r" % type(obj))
    else:
        return obj

对象等价性对于对象持久性很重要,但对于序列化不重要,而序列化正是OP进行哈希处理所需要的。对于记忆,所需要的只是对象的行为相同,而不是完全相同的对象。