当我运行下面的代码时,我得到了分别为3和36的答案。
x ="abd"
print len(x)
print sys.getsizeof(x)
有人能够解释一下它们之间的区别吗?
x ="abd"
print len(x)
print sys.getsizeof(x)
有人能够解释一下它们之间的区别吗?
len()
查询容器中包含的项目数。对于字符串,这是字符数:sys.getsizeof()
返回对象的内存大小:sys.getsizeof()
函数包括垃圾收集器的开销(如果有的话):
getsizeof()
调用对象的__sizeof__
方法,如果对象由垃圾回收器管理,则会添加额外的垃圾回收器开销。
字符串对象不需要被跟踪(它们不能创建循环引用),但是字符串对象需要比每个字符的字节更多的内存。在 Python 2 中,__sizeof__
方法返回(在 C 代码中):
Py_ssize_t res;
res = PyStringObject_SIZE + PyString_GET_SIZE(v) * Py_TYPE(v)->tp_itemsize;
return PyInt_FromSsize_t(res);
这里的PyStringObject_SIZE
是该类型的C结构头大小,PyString_GET_SIZE
基本上与len()
相同,Py_TYPE(v)->tp_itemsize
是每个字符的大小。在Python 2.7中,字节字符串的每个字符大小为1,但是它是PyStringObject_SIZE
让你感到困惑;在我的Mac上,该大小为37字节:
>>> sys.getsizeof('')
37
unicode
字符串,每个字符的大小会增加到2或4(取决于编译选项)。在Python 3.3及更高版本中,Unicode字符串每个字符占用1到4个字节,具体取决于字符串的内容。如果您需要计算容器及其引用的任何内容的内存占用量,您将需要使用某种遍历到这些包含对象并获取其大小的方法;文档指向了一个递归配方。只计算直接归因于对象的内存消耗,而不计算它引用的对象的内存消耗。
关键区别在于len()将给出容器元素的实际长度,而sys.sizeof()将给出其占用的内存大小。
有关更多信息,请阅读Python文档,可在以下链接中找到: https://docs.python.org/3/library/sys.html#module-sys