- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有没有人能解释testLookups()
下的注释 code snippet ?
我已经运行了代码,确实评论说的是真的。但是我想了解为什么它是真的,即为什么 cPickle 根据引用方式为同一对象输出不同的值。
和引用计数有关系吗?如果是这样,那不是某种错误 - 即 pickle 和反序列化的对象将具有异常高的引用计数并且实际上永远不会被垃圾收集?
最佳答案
不能保证看似相同的对象会产生相同的 pickle 字符串。
pickle 协议(protocol)是一个虚拟机,pickle 字符串是该虚拟机的程序。对于给定的对象,存在多个 pickle 字符串(=程序),它们将准确地重建该对象。
举一个例子:
>>> from cPickle import dumps
>>> t = ({1: 1, 2: 4, 3: 6, 4: 8, 5: 10}, 'Hello World', (1, 2, 3, 4, 5), [1, 2, 3, 4, 5])
>>> dumps(({1: 1, 2: 4, 3: 6, 4: 8, 5: 10}, 'Hello World', (1, 2, 3, 4, 5), [1, 2, 3, 4, 5]))
"((dp1\nI1\nI1\nsI2\nI4\nsI3\nI6\nsI4\nI8\nsI5\nI10\nsS'Hello World'\np2\n(I1\nI2\nI3\nI4\nI5\ntp3\n(lp4\nI1\naI2\naI3\naI4\naI5\nat."
>>> dumps(t)
"((dp1\nI1\nI1\nsI2\nI4\nsI3\nI6\nsI4\nI8\nsI5\nI10\nsS'Hello World'\n(I1\nI2\nI3\nI4\nI5\nt(lp2\nI1\naI2\naI3\naI4\naI5\natp3\n."
这两个 pickle 字符串在 p
操作码的使用上有所不同。该操作码接受一个整数参数,其功能如下:
name='PUT' code='p' arg=decimalnl_short
Store the stack top into the memo. The stack is not popped.
The index of the memo location to write into is given by the newline-
terminated decimal string following. BINPUT and LONG_BINPUT are
space-optimized versions.
长话短说,两个pickle字符串基本等价。
我还没有尝试确定生成的操作码差异的确切原因。这很可能与被序列化的对象的引用计数有关。然而,很明显,这样的差异不会对重建的对象产生影响。
关于python - cPickle - pickle 同一对象的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7501577/
如何让此代码在重新打开时记住秤的最后位置? import Tkinter import cPickle root = Tkinter.Tk() root.sclX = Tkinter.Scale(ro
我正在尝试使用 cPickle 加载一个文件,如下所示, import cPickle cPickle.load(open('test', 'rb')) 但是,我得到这个错误, -----------
我有一个列表列表,每个子列表看起来像这样: a = [datetime.datetime(2012, 2, 1), datetime.datetime(2012, 2, 2), 'string', 4
我浏览了相关 cPickle 问题的各种回复,但似乎没有一个有帮助。使用 cloudpickle 代替 cPickle 也没有效果。 我有一个名为 MyModule 的模块,它定义了一个 MyClas
我有大约 80 万张 256x256 RGB 图像,总计超过 7GB。 我想将它们用作卷积神经网络中的训练数据,并想将它们连同它们的标签一起放入 cPickle 文件中。 现在,这占用了大量内存,以至
我正在使用 cPickle 序列化用于日志记录的数据。 我希望能够将我想要的任何东西放入对象中,然后将其序列化。通常这对 cPickle 没问题,但遇到了一个问题,我想序列化的对象之一包含一个函数。这
我正在使用 cPickle 将字典对象存储到文件中,并且无法获取除第一个条目之外的任何其他条目。最初,文件 tweets.pkl 为空,并且引发 EOFError。我确信这与它有关。谢谢 #!/usr
在我的脚本中,我尝试使用cPickle保存字典。一切工作正常,除了加载的字典已经修改每个键。我的字典看起来像:{'a':[45,155856,26,98536], 'b':[88,68,9454,78
我希望能够有一系列使用相同 pickle 文件的嵌套循环。见下文: def pickleRead(self): try: with open(r'myfile', 'rb')
cPickle.dump(object,file) 总是在文件末尾转储。有没有办法在文件中的特定位置转储?我希望下面的代码片段能够工作 file = open("test","ab") file.se
我有一个 python 程序,我想从 cmd 提示符运行,但每次我尝试时,它总是给我一个错误“NameError: name cPickle is not defined”。 我使用的是 python
你能帮我实现这个例子吗? 如果序列化字典存在,我想加载它,修改它并再次转储它。我认为我用于打开文件的模式有问题,但我不知道正确的方法。 import os import cPickle as pick
python 对象是字符串和数字的嵌套列表。 文件被打开以写入“w”(不是“wb”)但 cPickle 被告知使用 protocol=1(所以二进制)。 序列化和反序列化代码在 Linux 上运行良好
我意识到答案很可能是“否”! 基本上,我有一个表示正方形网格的图(节点和边类型);每个节点对象都包含对该节点有边的每个其他节点的引用,这似乎意味着当使用 cPickle.dump 序列化图形时,它以深
我有一个名为 classifier.pkl 的 pickled 文件,我正试图将其加载到另一个模块中。但是,我收到一个我不明白的错误。 我要 pickle 的代码: features = ['bob'
我将运行代码,将大量(~1000)个相对较小(50 个键:值对字符串)的字典写入日志文件。我将通过一个自动执行此操作的程序来完成此操作。我正在考虑运行如下命令: import random impor
我想在文件中保存一个 pickle.dumps() 结果,每行一个结果,如下例所示。然后当我读取文件时加载行时,我发现相同的结果包含一个换行符。 数据,由制表符分隔: 20120305\txxxxx\
我正在考虑创建像 dbms 引擎这样的持久存储的想法,与直接 cPickling 对象和/或使用搁置模块相比,创建自定义二进制格式有什么好处? 最佳答案 Pickling 是一个双面硬币。 一方面,您
有没有人能解释testLookups() 下的注释 code snippet ? 我已经运行了代码,确实评论说的是真的。但是我想了解为什么它是真的,即为什么 cPickle 根据引用方式为同一对象输出
我是 Python 新手。我正在将别人的代码从 Python 2.X 改编到 3.5。该代码通过 cPickle 加载文件。我将所有出现的“cPickle”更改为“pickle”,因为我知道 pick
我是一名优秀的程序员,十分优秀!