2010-10-25 12 views
46

Gibt es eine Funktion, die mir sagen wird, wie viele Bytes eine Zeichenfolge im Speicher belegt?Wie viele Bytes hat eine Zeichenfolge?

Ich muss eine Größe eines Socket-Buffer festlegen, um die gesamte Zeichenfolge auf einmal zu übertragen.

+6

Also nicht über die Größe der Zeichenfolge, die Sie kümmern im Speicher, sondern wie lange es in einer bestimmten Kodierung ist. Der übliche Weg wäre, die Zeichenfolge in ein Byte-Array (möglicherweise Byte-Zeichenfolge in Python) in der Codierung zu konvertieren, die Sie übertragen müssen (UTF-8 zum Beispiel) und die Länge zu erhalten. – Joey

+3

Wie wäre es mit builtin len()? – gimel

+0

@Joey: Ich verstehe dich nicht, warum denkst du, es ist die Länge in einer Codierung? Auch ich bin mit dem gleichen Problem konfrontiert, da ich die Größe des (String-) Inhalts wissen muss, der über die Leitung gesendet werden soll. Was ich wirklich brauche, ist die Größe in Bytes, was würde ich mit der Länge dieser Zeichenfolge machen? – 0xc0de

Antwort

57
import sys 
sys.getsizeof(s) 

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

Aber eigentlich müssen Sie seine repräsentiert Länge wissen, so etwas wie len(s) genug sein sollte.

+1

+1 für die Funktion. Gibt das nicht das gesamte zusätzliche Gepäck zurück, um das Objekt darzustellen? Der Rest der Felder im PyObject. –

+3

@Noufal - genau. Für eine einfache 'a' Zeichenfolge gibt es 41. – eumiro

+1

mein 'a' benötigt 25 Bytes; entweder 64-Bit-Python oder die Schriftart, die ich verwende, hat einfachere Striche :) – tzot

57

Wenn es ein Python 2.x ist str, erhalten Sie len. Wenn es ein Python 3.x str (oder ein Python 2.x unicode) ist, kodieren Sie zuerst bytes (oder str) mit Ihrer bevorzugten Kodierung ('utf-8' ist eine gute Wahl) und dann erhalten Sie die len der kodierten Bytes/str Objekt.


Zum Beispiel ASCII-Zeichen zu je 1 Byte:

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

während chinesische diejenigen 3 Bytes verwenden jeweils:

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

In der Tat ist dies die richtige Antwort. Diese 'sys.getsizeof()' gibt Ihnen nicht, was Sie wollen. Also, wenn Sie eine utf-8 codierte Zeichenfolge haben, anstatt "len (myString)" zu sagen, sagen Sie einfach "len (myString.encode (" utf8 "))' – Tom

+1

Dies sollte die richtige Antwort sein. Es wird Ihnen genau sagen, wie viele Bytes Sie für die Zeichenfolge benötigen, Unicode oder nicht. Es besteht eine gute Chance, dass die Zeichenfolge sowieso für die Übertragung in Bytes codiert wird, also bezweifle ich, dass es überhaupt einen Leistungseinbruch geben würde. – Taywee

Verwandte Themen