字符串有多少字节

Ric*_*nop 53 python

是否有一些函数可以告诉我字符串在内存中占用多少字节?

我需要设置套接字缓冲区的大小,以便一次传输整个字符串.

tzo*_*zot 72

如果它是Python 2.x str,那就得到它len.如果它是Python 3.x str(或Python 2.x unicode),首先使用您的首选编码(bytes或一个str分别)编码('utf-8'是一个不错的选择),然后获取len编码的bytes/str对象.


例如,ASCII字符每个使用1个字节:

>>> len("hello".encode("utf8"))
5
Run Code Online (Sandbox Code Playgroud)

而中国人每人使用3个字节:

>>> len("??".encode("utf8"))
6
Run Code Online (Sandbox Code Playgroud)

  • 确实,这是正确的答案.这个`sys.getsizeof()`没有给你你想要的东西.所以,如果你有一个utf-8编码的字符串,而不是说`len(myString)`,只要说`len(myString.encode("utf8"))` (9认同)
  • 这应该是正确的答案。它会准确地告诉您字符串需要多少字节,无论是否为 unicode。无论如何,字符串很有可能被编码为字节以进行传输,所以我怀疑甚至会影响性能。 (2认同)

eum*_*iro 56

import sys
sys.getsizeof(s)

# getsizeof(object, default) -> int
# Return the size of object in bytes.
Run Code Online (Sandbox Code Playgroud)

但实际上你需要知道它所代表的长度,所以len(s)应该就足够了.

  • 暂时忽略`sys.getsizeof()`与OP的问题完全无关:25或41的大小是无意义的; `malloc()`和朋友通常分配内存块,其大小是`2**n`的倍数,其中`n`肯定大于1,并且一些块被malloc开销和`sys.getsizeof( )`不允许任何这个(因为它不知道malloc实现的任何细节). (9认同)
  • @Noufal - 确切地说.对于一个简单的'a'字符串,它返回41. (6认同)
  • +1功能.这不会返回代表物品的所有额外行李吗?PyObject中的其余字段. (4认同)
  • 对于Unicode,`len(s)`是不够的,因为许多字符占用多个字节.请参阅tzot的答案(使用Unicode时首先转换为字节). (3认同)
  • 我的“ a”需要25个字节;因此,无论您运行的是64位Python还是我使用的字体都比较简单:) (2认同)
  • 这个答案可能会有点误导性地加深人们正在寻找的内容——虽然它会返回内存中的大小**在Python**中,但根据[文档](https: //docs.python.org/3.7/library/sys.html#sys.getsizeof): `getsizeof() 调用对象的 __sizeof__ 方法,如果对象由垃圾收集器管理,则会增加额外的垃圾收集器开销。`同样的事情对于蟒蛇2 (2认同)