58
votes

Is there some function which will tell me how many bytes does a string occupy in memory?

I need to set a size of a socket buffer in order to transfer the whole string at once.

2
So you don't care about the size of the string in memory but rather how long it is in a specific encoding. The usual way would be to convert the string into a byte array (possibly byte string in Python) in the encoding you need to transfer (UTF-8 for example) and get the length. - Joey
@Joey: I don't get you, why do you think it's the length in an encoding? Even I am facing the same issue, needing to know the size of the (string) contents to be sent over the wire. What I really need is the size, in bytes, what would I do with length of that string? - 0xc0de
@0xc0de: “pure” Unicode cannot be sent over the wire unless encoded to bytes. The most common general encodings are “utf-32”, “utf-16-be”/“utf-16-le” or “utf-8” (a very sensible choice since it won't contain null bytes). - tzot

2 Answers

61
votes
import sys
sys.getsizeof(s)

# getsizeof(object, default) -> int
# Return the size of object in bytes.

But actually you need to know its represented length, so something like len(s) should be enough.

83
votes

If it's a Python 2.x str, get its len. If it's a Python 3.x str (or a Python 2.x unicode), first encode to bytes (or a str, respectively) using your preferred encoding ('utf-8' is a good choice) and then get the len of the encoded bytes/str object.


For example, ASCII characters use 1 byte each:

>>> len("hello".encode("utf8"))
5

whereas Chinese ones use 3 bytes each:

>>> len("你好".encode("utf8"))
6