【问题标题】:Memory-usage of dictionary in Python?Python中字典的内存使用?
【发布时间】:2011-07-05 08:23:44
【问题描述】:

当我将sys 模块中的getsizeof 方法用于字典时,我有点困惑。下面我创建了一个包含两个字符串的简单字典。这两个字符串的大小明显大于字典中的一个。字典大小可能只是字典开销,即它不考虑实际数据。找出整个字典(键、值、字典开销)的内存使用情况的最佳方法是什么?

>>> first = 'abc'*1000
>>> second = 'def'*1000
>>> my_dictionary = {'first': first, 'second': second}
>>> getsizeof(first)
3021
>>> getsizeof(second)
3021
>>> getsizeof(my_dictionary)
140

【问题讨论】:

    标签: python dictionary memory-management


    【解决方案1】:

    来自PythonDocs

    有关使用 getsizeof() 递归查找容器大小及其所有内容的示例,请参阅 recursive sizeof recipe

    所以它只计算开销,但你可以使用this link 中的函数来计算它对于像dicts 这样的容器。

    【讨论】:

    • 它不适用于像d = dict(a="4", b="4", c="4", d="4") 这样的简单字典,它正在跳过与b,c,d 对应的值
    • 对不起,我猜你的代码是正确的,在上述情况下,python 正在重用对象"4"
    【解决方案2】:

    递归getsizeof 会得到实际大小,但如果你有多层字典并且只想粗略估计。 json 派上用场了。

    >>> first = 'abc'*1000
    >>> second = 'def'*1000
    >>> my_dictionary = {'first': first, 'second': second}
    >>> getsizeof(first)
    3049
    >>> getsizeof(second)
    3049
    >>> getsizeof(my_dictionary)
    288
    >>> getsizeof(json.dumps(my_dictionary))
    6076
    >>> size = getsizeof(my_dictionary)
    >>> size += sum(map(getsizeof, my_dictionary.values())) + sum(map(getsizeof, my_dictionary.keys()))
    >>> size
    6495
    

    【讨论】:

    • 绝对是创意点,但它需要所有东西都可以序列化,它比较慢,而且正如你所说的那样,它是一个近似值......
    【解决方案3】:

    好吧,字典并不在其中存储实际的字符串,它的工作方式有点像 C/C++ 指针,所以你只会在字典中为每个元素获得一个恒定的开销。

    总大小为

    size = getsizeof(d)
    size += sum(map(getsizeof, d.itervalues())) + sum(map(getsizeof, d.iterkeys()))
    

    【讨论】:

    • 为了迂腐,如果任何值是容器(而不是标量),它也需要向下钻取该容器。
    猜你喜欢
    • 2023-03-05
    • 2012-05-03
    • 1970-01-01
    • 2023-03-30
    • 2014-06-04
    • 2015-01-25
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    相关资源
    最近更新 更多