len 和 sizeof 的区别
Posted
技术标签:
【中文标题】len 和 sizeof 的区别【英文标题】:difference between len and sizeof 【发布时间】:2021-07-23 01:26:44 【问题描述】:我正在使用 python 3.6 - 我正在尝试使用 struct 库来打包要使用 UDP 发送到自定义协议的小端数据包。
如果我们执行len(struct.pack('<hhislddiii',1,2,3,b'C',1,2,3,4,5,6))
,那么我们会得到 41,这是正确的字节长度。但是,如果我们做struct.pack('<hhislddiii',1,2,3,b'C',1,2,3,4,5,6).__sizeof__()
,我们会得到 58。有人可以解释一下这两者有什么区别吗?我正在尝试使用 scapy 作为 UDP 数据包来制作数据包,因此获得正确的数据包格式至关重要。想了解其中的区别。
【问题讨论】:
sizeof
是 Python 内部数据结构的大小。它包括诸如对象类型和引用计数等信息。它与您正在设置的数据中的字节数只有有限的关系,并且通常会更大;有时更小,例如,一个列表,它存储对列表元素的引用,而不是数据。 sizeof
主要在您拥有庞大的数据结构并且内存不足时很有用。
谢谢!是的,我现在明白了。
【参考方案1】:
len
是集合中的项目数。 __sizeof__
是该对象的大小(以字节为单位)。另外,你通常不会单独调用__sizeof__
,Pythonic 的做法是调用sys.getsizeof(object_name)
。
source
【讨论】:
在这种情况下,没有 41 个元素,所以不确定我是否理解您的答案。有意为 41 个字节。注意到 pythonic 的东西 - 但你可能知道额外的 17 个字节用于什么? 很公平,我无法解释这个确切的情况。以上是关于len 和 sizeof 的区别的主要内容,如果未能解决你的问题,请参考以下文章
#define LEN sizeof(struct shu) 是啥意思
sizeof(T) 和 Unsafe.SizeOf<T>() 有啥区别?
使用 Malloc,sizeof(int) * numRows 和 sizeof(int * [numRows]) 之间的区别