python 中 len() 和 sys.getsizeof() 方法有什么区别?
- 2025-04-10 09:46:00
- admin 原创
- 16
问题描述:
当我运行下面的代码时,我分别得到了 3 和 36 作为答案。
x ="abd"
print len(x)
print sys.getsizeof(x)
有人能向我解释一下它们之间有什么区别吗?
解决方案 1:
它们根本不是一回事。
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 个字节,具体取决于字符串的内容。
对于引用其他对象的容器(例如字典或列表),给定的内存大小仅涵盖容器使用的内存以及用于引用其他对象的指针值。没有直接的方法可以包含“包含的”对象的内存大小,因为这些相同的对象可能在其他地方有更多引用,并且不一定由单个容器拥有。
文档中是这样描述的:
只考虑直接归因于该对象的内存消耗,而不考虑其引用的对象的内存消耗。
如果您需要计算容器的内存占用量以及该容器引用的任何内容,则必须使用某种方法遍历那些包含的对象并获取它们的大小;文档指向一个递归配方。
解决方案 2:
主要区别在于 len() 将给出容器中元素的实际长度,而 sys.getsizeof() 将给出其占用的内存大小
有关更多信息,请阅读 Python 文档,网址为
https://docs.python.org/3/library/sys.html#module-sys
扫码咨询,免费领取项目管理大礼包!