为了账号安全,请及时绑定邮箱和手机立即绑定

python中的len()和sys.getsizeof()方法有什么区别?

python中的len()和sys.getsizeof()方法有什么区别?

富国沪深 2019-11-19 14:39:08
当我运行以下代码时,我分别得到3和36作为答案。x ="abd"print len(x)print sys.getsizeof(x)有人可以向我解释它们之间有什么区别吗?
查看完整描述

1 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

他们是不一样的东西可言。


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 struct标头大小,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个字节,具体取决于字符串的内容。


查看完整回答
反对 回复 2019-11-19
  • 1 回答
  • 0 关注
  • 1151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信