Python 使用pickle.dumps散列可变对象

Python 使用pickle.dumps散列可变对象,python,hash,python-3.x,Python,Hash,Python 3.x,我明白为什么把可变对象放在字典里是危险的。然而,将所有列表/集合转换为元组/冻结集是昂贵的;对于许多类型,根本没有容易获得的不变版本。因此,有时可能值得直接对可变对象进行散列,并采取适当的预防措施以确保所讨论的对象永远不会被修改 在开始为可变对象实现自定义哈希函数之前,我想检查使用pickle.dumps作为哈希函数是否有任何缺点,无论是在性能、冲突还是其他方面。pickle的输出不保证是规范的,原因与dict和set order的不确定性类似。不要使用pickle、pprint或repr进行哈

我明白为什么把可变对象放在字典里是危险的。然而,将所有列表/集合转换为元组/冻结集是昂贵的;对于许多类型,根本没有容易获得的不变版本。因此,有时可能值得直接对可变对象进行散列,并采取适当的预防措施以确保所讨论的对象永远不会被修改


在开始为可变对象实现自定义哈希函数之前,我想检查使用
pickle.dumps
作为哈希函数是否有任何缺点,无论是在性能、冲突还是其他方面。

pickle的输出不保证是规范的,原因与dict和set order的不确定性类似。不要使用pickle、pprint或repr进行哈希运算。

pickle的输出不能保证是规范的,原因与dict和set顺序不确定类似。不要使用pickle、pprint或repr进行哈希运算。

即使它可以工作,也不会比将其转换为不可变的等价项更快(甚至更慢)。编辑:
timeit
为我确认这一点。将~4000个元素集转换为冻结集需要223µs/loop,而pickle.dumps需要19.8 ms/loop——读取时,速度要慢一个数量级。也就是2个数量级?如果是这样的话,你能把它作为一个答案发布吗?即使它有效,也不会比仅仅把它转换成不可变的等价物更快(甚至更慢)。编辑:
timeit
为我确认这一点。将~4000个元素集转换为冻结集需要223µs/loop,而pickle.dumps需要19.8 ms/loop——读取时,速度要慢一个数量级。也就是2个数量级?如果是的话,你能把它贴出来作为答案吗?