固定PYTHONHASHSEED后cloudpickle序列化结果每次运行不同的原因是什么?
问题原因
你观察到的32位随机字符串是cloudpickle为动态定义类生成的临时唯一标识,和你设置的PYTHONHASHSEED没有关系,具体逻辑如下:
- 当序列化的类不属于可稳定导入的标准/第三方模块时(示例中直接定义在
__main__模块下的Foo类、REPL中定义的类、函数内部的嵌套类都属于这类场景),cloudpickle不会只存储类的导入路径,而是会把类的完整定义打包到序列化结果中。 - 为了避免不同运行时中同名类反序列化时出现命名空间冲突,cloudpickle会为每一个这类动态类生成一个随机UUID字符串,写入序列化结果作为临时命名空间标识。这个UUID是通过随机数直接生成的,不受Python哈希种子配置控制,所以每次程序启动都会生成不同的值,最终导致完全相同的类定义每次序列化得到的结果都有差异。
确定性序列化方案
如果需要得到固定的序列化结果,可以将Foo类移动到单独的可导入模块文件中,比如新建foo.py写入Foo的定义,再在主脚本中通过from foo import Foo导入后再执行序列化操作。此时cloudpickle会直接存储类的固定导入路径,不会生成随机UUID,序列化结果就会稳定一致。
内容的提问来源于stack exchange,提问作者skgbanga
相关产品推荐
相关产品推荐

