2010-10-25 50 views
46

¿Hay alguna función que me diga cuántos bytes ocupa una cadena en la memoria?¿Cuántos bytes tiene una cadena

Necesito establecer el tamaño de un buffer de socket para transferir toda la cadena de una vez.

+6

Así que no importa el tamaño de la cadena en memoria, sino cuánto tiempo está en una codificación específica. La forma habitual sería convertir la cadena en una matriz de bytes (posiblemente cadena de bytes en Python) en la codificación que necesita transferir (UTF-8, por ejemplo) y obtener la longitud. – Joey

+3

¿Qué tal builtin len()? – gimel

+0

@Joey: No te entiendo, ¿por qué crees que es la longitud de una codificación? Incluso estoy enfrentando el mismo problema, necesitando saber el tamaño del contenido (cadena) que se enviará a través del cable. Lo que realmente necesito es el tamaño, en bytes, ¿qué haría con la longitud de esa cadena? – 0xc0de

Respuesta

57
import sys 
sys.getsizeof(s) 

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

Pero en realidad lo que necesita saber su longitud representada, así que algo como len(s) debería ser suficiente.

+1

+1 para la función. ¿Esto no devuelve todo el equipaje extra para representar el objeto? El resto de los campos en el PyObject. –

+3

@Noufal - exactamente. Para una cadena simple 'a', devuelve 41. – eumiro

+1

mi 'a' necesita 25 bytes; así que o bien ejecutas Python de 64 bits o la fuente que uso tiene trazos más simples :) – tzot

57

Si es un Python 2.x str, obtenga su len. Si es un Python 3.x str (o un Python 2.x unicode), primero codifique bytes (o un str, respectivamente) usando su codificación preferida ('utf-8' es una buena opción) y luego obtenga el len de los bytes codificados/objeto str


Por ejemplo, los caracteres ASCII utiliza 1 byte cada uno:

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

mientras que los chinos usan 3 bytes cada uno:

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

De hecho, esta es la respuesta correcta. Este 'sys.getsizeof()' no le proporciona lo que desea. Por lo tanto, si tiene una cadena codificada en utf-8, en lugar de decir 'len (myString)', simplemente diga 'len (myString.encode (" utf8 "))' – Tom

+1

Esta debería ser la respuesta correcta. Le dirá exactamente cuántos bytes necesita para la cadena, unicode o no. Existe una buena posibilidad de que la cadena se codifique en bytes para la transmisión de todos modos, así que dudo que incluso haya un golpe de rendimiento. – Taywee

Cuestiones relacionadas