【问题标题】:size of nested dictionary and list嵌套字典和列表的大小
【发布时间】:2016-05-22 04:43:31
【问题描述】:

我有以下格式的字典:

演示代码:

>>> 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
>>> 

我无法知道嵌套字典是如何存储在内存中的,因为如果 data 的大小为 136 字节,data["sequence"] 的大小为 80 字节,data["lookup"] 的大小为 520 字节。

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

演示代码:

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

谁能解释一下为什么?

【问题讨论】:

    标签: python string list dictionary


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 1.是的,字典存储参考。如何获得嵌套字典的总大小?或者我们可以通过类型转换为字符串来获取大小?
    • @VivekSable:我已经回答过了。递归,但要考虑到您可以多次存储循环引用和对象。例如,一个 Python 进程只有 一个 None 对象,所以当你有 {'foo': None, 'bar': None, 'baz': None} 时不要多次计算它。
    • @VivekSable: 并且使用 str() 与准确反映内存使用情况相去甚远。
    • 我没有刷新答案。是的,str() 不是找出嵌套字典大小的最佳方法。
    猜你喜欢
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多