【问题标题】:Why the size of the python reference is so large?为什么python引用的大小这么大?
【发布时间】:2018-02-15 18:19:36
【问题描述】:

Python: Size of Reference?

根据上面的讨论,参考大小应该限制为 8 个字节。 但是,根据我的经验,引用的大小约为 200 字节。具体来说,指向一个集合的self.ptr是224;而指向集合的 self.last_ptr 是 208。

问题> 我们能否以某种方式减小 Python 中的 Hello 类的大小?

In [24]: import sys
    ...: from pympler import asizeof
    ...:
    ...: class Hello(object):
    ...:     def __init__(self):
    ...:         self.name = None
    ...:         self.ptr = None
    ...:         self.last_ptr = None
    ...:
    ...: hello = Hello()
    ...: print("0={0}\n".format(asizeof.asizeof(hello)))
    ...:
    ...: hello.name = '0123456789'
    ...: print("1={0}\n".format(asizeof.asizeof(hello)))
    ...:
    ...: a = set()
    ...: hello.ptr = a
    ...: print("2={0}\n".format(asizeof.asizeof(hello)))
    ...:
    ...: b = set()
    ...: hello.last_ptr = b
    ...: print("3={0}\n".format(asizeof.asizeof(hello)))
    ...:
    ...: print("4={0}\n".format(asizeof.asizeof(100)))
    ...:
0=344

1=408

2=632

3=840

4=32


In [25]: 632-408
Out[25]: 224

In [26]: 840-632
Out[26]: 208

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    您不是在测量单个参考的大小。

    pympler.asizeof() 产生整个 Python 对象的内存占用,递归到属性。具有属性的__dict__ 字典对象的实例对象,包含属性的3 个键值对,加上对类的引用和弱引用部分不是单个引用

    引用the documentation:

    pympler.asizeof 可用于调查某些 Python 对象消耗了多少内存。与sys.getsizeof 相比,asizeof 递归地调整对象大小。

    我的大胆强调。

    要计算单个引用的大小,请创建一个空元组和一个包含单个元素的元组。内存大小的差异(由sys.getsizeof() 衡量,不是递归)是一个引用的大小:

    >>> import sys, platform
    >>> sys.version_info
    sys.version_info(major=3, minor=6, micro=4, releaselevel='final', serial=0)
    >>> platform.platform()
    'Darwin-17.4.0-x86_64-i386-64bit'
    >>> sys.getsizeof((None,)) - sys.getsizeof(())
    8
    

    或者使用元组类型的__itemsize__属性:

    >>> tuple.__itemsize__
    8
    

    所以在 64 位 OS X 系统上,引用长度为 8 个字节。

    【讨论】:

      猜你喜欢
      • 2015-02-13
      • 2018-11-23
      • 1970-01-01
      • 2012-11-08
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多