32

当我运行下面的代码时,我分别得到 3 和 36 作为答案。

x ="abd"
print len(x)
print sys.getsizeof(x)

有人可以向我解释它们之间有什么区别吗?

4

2 回答 2

70

它们根本不是一回事。

len()查询容器中包含的项目数。对于字符数的字符串:

返回对象的长度(项目数)。参数可以是序列(字符串、元组或列表)或映射(字典)。

sys.getsizeof()另一方面返回对象的内存大小

返回对象的大小(以字节为单位)。对象可以是任何类型的对象。所有内置对象都将返回正确的结果,但这对于第三方扩展不一定适用,因为它是特定于实现的。

Python 字符串对象不是简单的字符序列,每个字符 1 个字节。

具体来说,该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 个字节,具体取决于字符串的内容

于 2013-07-10T15:01:12.390 回答
1

关键区别在于 len() 将给出容器中元素的实际长度,而 sys.sizeof() 将给出它占用的内存大小

有关更多信息,请阅读https://docs.python.org/3/library/sys.html#module-sys上提供的 python 文档

于 2021-03-16T03:57:14.013 回答