python - 嵌套字典和列表的大小

标签 python string list dictionary

我有以下格式的字典:

演示代码:

>>> import pprint
>>> pprint.pprint(data)
{'lookup': {'F01': '\n.custom1 {\n    background-color: #f5e9dc;\n    padding: 10px;\n    border-radius: 10px;\n    font-family: sans-serif;\n    font-size: 0.9em;\n    margin-top: 1em;\n    }\n.custom2 .style8-rw {\n    font-family: sans-serif;\n    font-weight: bold;\n    color: #F57215;\n    }',
            'F02': '\n.custom1 {\n    background-color: #f5e9dc;\n    padding: 10px;\n    border-radius: 10px;\n    font-family: sans-serif;\n    font-size: 0.9em;\n    margin-top: 1em;\n    }\n.custom2 .style8-rw {\n    font-family: sans-serif;\n    font-weight: bold;\n    color: #F57215;\n    }',
            'F03': '\n.custom1 {\n    background-color: #f5e9dc;\n    padding: 10px;\n    border-radius: 10px;\n    font-family: sans-serif;\n    font-size: 0.9em;\n    margin-top: 1em;\n    }\n.custom2 .style8-rw {\n    font-family: sans-serif;\n    font-weight: bold;\n    color: #F57215;\n    }',
            'F04': '\n.custom1 {\n    background-color: #f5e9dc;\n    padding: 10px;\n    border-radius: 10px;\n    font-family: sans-serif;\n    font-size: 0.9em;\n    margin-top: 1em;\n    }\n.custom2 .style8-rw {\n    font-family: sans-serif;\n    font-weight: bold;\n    color: #F57215;\n    }',
            'F05': '\n.custom1 {\n    background-color: #f5e9dc;\n    padding: 10px;\n    border-radius: 10px;\n    font-family: sans-serif;\n    font-size: 0.9em;\n    margin-top: 1em;\n    }\n.custom2 .style8-rw {\n    font-family: sans-serif;\n    font-weight: bold;\n    color: #F57215;\n    }',
            'F06': '\n.custom1 {\n    background-color: #f5e9dc;\n    padding: 10px;\n    border-radius: 10px;\n    font-family: sans-serif;\n    font-size: 0.9em;\n    margin-top: 1em;\n    }\n.custom2 .style8-rw {\n    font-family: sans-serif;\n    font-weight: bold;\n    color: #F57215;\n    }',
            'F07': '\n.custom1 {\n    background-color: #f5e9dc;\n    padding: 10px;\n    border-radius: 10px;\n    font-family: sans-serif;\n    font-size: 0.9em;\n    margin-top: 1em;\n    }\n.custom2 .style8-rw {\n    font-family: sans-serif;\n    font-weight: bold;\n    color: #F57215;\n    }',
            'F08': '\n.custom1 {\n    background-color: #f5e9dc;\n    padding: 10px;\n    border-radius: 10px;\n    font-family: sans-serif;\n    font-size: 0.9em;\n    margin-top: 1em;\n    }\n.custom2 .style8-rw {\n    font-family: sans-serif;\n    font-weight: bold;\n    color: #F57215;\n    }',
            'F09': '\n.custom1 {\n    background-color: #f5e9dc;\n    padding: 10px;\n    border-radius: 10px;\n    font-family: sans-serif;\n    font-size: 0.9em;\n    margin-top: 1em;\n    }\n.custom2 .style8-rw {\n    font-family: sans-serif;\n    font-weight: bold;\n    color: #F57215;\n    }',
            'F10': '\n.custom1 {\n    background-color: #f5e9dc;\n    padding: 10px;\n    border-radius: 10px;\n    font-family: sans-serif;\n    font-size: 0.9em;\n    margin-top: 1em;\n    }\n.custom2 .style8-rw {\n    font-family: sans-serif;\n    font-weight: bold;\n    color: #F57215;\n    }',
            'F11': '\n.custom1 {\n    background-color: #f5e9dc;\n    padding: 10px;\n    border-radius: 10px;\n    font-family: sans-serif;\n    font-size: 0.9em;\n    margin-top: 1em;\n    }\n.custom2 .style8-rw {\n    font-family: sans-serif;\n    font-weight: bold;\n    color: #F57215;\n    }',
            'F12': '\n.custom1 {\n    background-color: #f5e9dc;\n    padding: 10px;\n    border-radius: 10px;\n    font-family: sans-serif;\n    font-size: 0.9em;\n    margin-top: 1em;\n    }\n.custom2 .style8-rw {\n    font-family: sans-serif;\n    font-weight: bold;\n    color: #F57215;\n    }'},
 'sequence': ['F01',
              'F02',
              'F03',
              'F04',
              'F05',
              'F06',
              'F07',
              'F08',
              'F09',
              'F10',
              'F11',
              'F12']}
>>> import sys
>>> sys.getsizeof(data)
136
>>> sys.getsizeof(data["sequence"])
80
>>> sys.getsizeof(data["lookup"])
520
>>> 

我不知道嵌套字典是如何存储在内存中的,因为 size if data 是 136 字节,而 size of data["sequence"] 是 80 字节,也是 size data["lookup"] 的大小为 520 字节。

此外,当我将变量数据从 dictionary 类型转换为 string 时,字符串变量的大小为 3587 字节

演示代码:

>>> data_str = str(data)
>>> sys.getsizeof(data_str)
3587

谁能解释一下为什么?

最佳答案

字典和列表存储引用(就像 Python 中的所有其他标准容器一样)。 sys.getsizeof() 不遵循引用,它 为您提供 C 结构的内存占用。引用是 C 指针;它们的大小取决于您的特定平台。

将字典转换为字符串会以递归方式将内容转换为 (repr()) 字符串,因此所有这些引用都会被取消引用并包含在输出中。请注意,这并不是原始对象内存大小的准确反射(reflect);字符串包含字符,这取决于您的确切 Python 版本、操作系统和使用的 Unicode 代码点范围,每个字符占用多少内存,并且字符数与反射(reflect)的实际对象具有非线性关系。

如果您想知道字典及其内容的内存占用情况,您需要递归地这样做。考虑到字典可以包含对自身的引用(直接或间接),或者任何对象都可以有多个对它的引用,并且应该只计算一次。我会使用 id() function跟踪已经处理了哪些对象。

Stack Overflow 上已经有几篇文章讨论了使用递归或其他工具计算容器的内存大小,请参阅 Deep version of sys.getsizeof , Python deep getsizeof list with contents? , 和 Memory-usage of dictionary in Python?举一些例子。

关于python - 嵌套字典和列表的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35338785/

相关文章:

javascript - 如何在 Canvas 上创建 "fuzzy" Material 设计类型阴影?

python - 喘息模板字典变量查找

python - 如何匹配嵌套字符串而不是单独的字符串

list - 满足 haskell 中大多数元素的函数

c++ - 指针指向一个我没想到的地址

python - 使用Python自动化数据清理,一些问题

python - 使用 Python 在 Mac OSX 中转义正斜杠路径目录?

c - 使用strtok将字符串划分为C中的数组

c - 矩阵不保留多个值

java - 我如何实际使用分隔符?