【问题标题】:Size of a dictionary in bytes字典的大小(以字节为单位)
【发布时间】:2017-07-29 20:21:51
【问题描述】:

如何手动计算字典的大小(它在内存中占用的字节数)。我读到它最初是 280 字节,在第 6 个键处增加,然后在第 86 个键处增加,依此类推。我想计算当我有超过 10000 个键时它将占用的大小。

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    sys.getsizeof 在这种情况下会有所帮助:

    from sys import getsizeof
    
    dct = {'a': 5, 'b': 7}
    
    print(getsizeof(dct))
    

    尤其是字典的大小将取决于您的 python 版本(实现最近发生了变化)。

    创建N 大小字典的快速方法是:

    from itertools import zip_longest
    dct = dict(zip_longest(range(N), (), fillvalue=None))
    # {0: None, 1: None, 2: None, ....}
    

    这应该有助于测试您对特定 python 版本的假设。

    this question 可能是相关的。

    【讨论】:

      【解决方案2】:

      sys.getsizeof 不适用于嵌套字典,如下例所示。

      >>> import sys
      >>> d = { "onj1": {"name":"object 01", "id": "123"},"onj2": {"name":"object 02", "id": "124"}}
      >>> d0 = {}
      >>> sys.getsizeof(d0)
      240
      >>> sys.getsizeof(d)
      240
      

      所以找到的解决方案就是本站提供的功能:post OR github

      跟随功能:

      import sys
      
      def get_size(obj, seen=None):
          """Recursively finds size of objects"""
          size = sys.getsizeof(obj)
          if seen is None:
              seen = set()
          obj_id = id(obj)
          if obj_id in seen:
              return 0
          # Important mark as seen *before* entering recursion to gracefully handle
          # self-referential objects
          seen.add(obj_id)
          if isinstance(obj, dict):
              size += sum([get_size(v, seen) for v in obj.values()])
              size += sum([get_size(k, seen) for k in obj.keys()])
          elif hasattr(obj, '__dict__'):
              size += get_size(obj.__dict__, seen)
          elif hasattr(obj, '__iter__') and not isinstance(obj, (str, bytes, bytearray)):
              size += sum([get_size(i, seen) for i in obj])
          return size
      

      【讨论】:

        【解决方案3】:

        您可以使用sys.getsizeof() 进行快速检查(它将以字节为单位返回对象的大小):

        >>> import sys, itertools
        >>> sys.getsizeof(dict(zip(range(1), itertools.cycle([1]))))
        280
        >>> sys.getsizeof(dict(zip(range(5), itertools.cycle([1]))))
        280
        >>> sys.getsizeof(dict(zip(range(6), itertools.cycle([1]))))
        1048
        >>> sys.getsizeof(dict(zip(range(85), itertools.cycle([1]))))
        3352
        >>> sys.getsizeof(dict(zip(range(86), itertools.cycle([1]))))
        12568
        >>> sys.getsizeof(dict(zip(range(87), itertools.cycle([1]))))
        12568
        >>> sys.getsizeof(dict(zip(range(10000), itertools.cycle([1]))))
        786712
        

        如果您对 Python 字典的实际内部工作感兴趣,dictobject.c 是权威资源(here 用于最新的 Python 3.6 分支)。另外,看看dictnotes.txt

        【讨论】:

          【解决方案4】:

          使用sys.getsizeof 获取尺寸信息

          【讨论】:

            猜你喜欢
            • 2014-01-27
            • 2013-05-03
            • 1970-01-01
            • 2013-04-26
            • 2018-01-01
            • 2011-06-17
            • 2016-03-19
            • 1970-01-01
            • 2013-02-01
            相关资源
            最近更新 更多