>>> import sys
>>> sys.getsizeof([])
32
>>> sys.getsizeof([1])
36
>>> sys.getsizeof('')
25
>>> sys.getsizeof('a')
26
>>> sys.getsizeof('cam')
28我对引用和紧凑数组有一个模糊的概念。
在Python中,列表是引用数组,因此它们使用更多的内存来存储引用元素的内存位置。
我只能从上面的例子中推断,列表中的整数占用额外的4个字节(32+4)。字符串是字符数组,一个unicode字符应该占用2位。
为什么空字符串占用25个字节?
为什么空列表占用32个字节?
发布于 2015-04-16 12:05:47
我只能从上面的例子中推断,列表中的整数占用额外的4个字节(32+4)。
不你想错了。
getsizeof不是递归的。特别是,列表的大小只是列表“头”的大小加上对其成员的引用数组。(在通常的CPython实现中,这些引用是PyObject *指针),这与列表中有什么样的对象没有关系,只有多少对象。
(同时,请记住,列表的结尾通常是松弛的。)因此,一个包含3个元素的列表可能实际上有一个由4个引用组成的数组,最后一个是空指针)。
同时,数字1本身可能不会占用任何存储空间。大多数Python实现都是小整数,因此有一个内置在Python中的1对象,不管您创建了多少个对数字1的引用,它们都只是对同一个对象的引用;您永远不会再创建另外4个字节。
为什么空字符串占用25个字节?
一个字符串类似于一个列表,一个字符串“头”,加上一个数组--只是一个字符数组,而不是对对象的引用。因为它们是不可变的,所以不需要松弛,这使得预测大小变得更容易。如果系统上的空字符串为25字节,这意味着字符串头为25字节,因此'abc'为28字节,'abcde'为30,依此类推。(这里假设的是Python2.x或Python3.2;如果使用3.0-3.2,则每个字符实际上是2或4个字节。虽然Python中的字符串实际上要复杂一些;如果您真的想知道,请阅读源代码。)
为什么空列表占用32个字节?
因为这就是列表标题的大小。
如果要查看这些头文件中的实际内容,则需要查看实现的源代码。假设您使用的是CPython,您可以找到它这里。(这指向最新的主干版本3.5alpha;您可以将URL中的default替换为2.7或3.3或任何您所关心的版本。)
例如,在C中,列表是PyListObject类型的。您可以搜索源,也可以猜测listobject.h可能是定义PyUnicodeObject的文件。那里,您将看到定义类型的C结构。总结成员时,有一个包含所有类型所需信息的通用标头(如refcount)、指向实际数组的指针和分配的计数。
发布于 2015-04-16 11:48:16
发布于 2015-04-16 11:53:33
一个unicode字符应该占用2位。为什么空字符串占用25位?
因为Python字符串(字节或unicode)是一个对象,而不是unicode字符。
>>> s = "a"
>>> type(s)
<type 'str'>
>>> dir(s)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>> https://stackoverflow.com/questions/29673762
复制相似问题