exc_info example python python-2.7

exc_info - sys python example



¿Cuál es la diferencia entre los métodos len() y sys.getsizeof() en python? (1)

No son lo mismo en absoluto .

len() consulta por el número de elementos contenidos en un contenedor. Para una cadena que es el número de caracteres:

Devuelve la longitud (el número de elementos) de un objeto. El argumento puede ser una secuencia (cadena, tupla o lista) o un mapeo (diccionario).

sys.getsizeof() por otro lado devuelve el tamaño de la memoria del objeto:

Devuelve el tamaño de un objeto en bytes. El objeto puede ser cualquier tipo de objeto. Todos los objetos incorporados devolverán los resultados correctos, pero esto no tiene que ser cierto para las extensiones de terceros, ya que es específico de la implementación.

Los objetos de cadena Python no son secuencias simples de caracteres, 1 byte por carácter.

Específicamente, la función sys.getsizeof() incluye la sobrecarga del recolector de basura, si corresponde:

getsizeof() llama al método __sizeof__ del objeto y agrega una sobrecarga adicional del recolector de elementos no utilizados si el recolector de elementos no utilizados administra el objeto.

Los objetos de cadena no necesitan ser rastreados (no pueden crear referencias circulares), pero los objetos de cadena necesitan más memoria que solo los bytes por carácter. En Python 2, el método __sizeof__ regresa (en código C):

Py_ssize_t res; res = PyStringObject_SIZE + PyString_GET_SIZE(v) * Py_TYPE(v)->tp_itemsize; return PyInt_FromSsize_t(res);

donde PyStringObject_SIZE es el tamaño del encabezado C struct para el tipo, PyString_GET_SIZE básicamente es lo mismo que len() y Py_TYPE(v)->tp_itemsize es el tamaño por carácter. En Python 2.7, para cadenas de bytes, el tamaño por carácter es 1, pero PyStringObject_SIZE te confunde; en mi Mac ese tamaño es de 37 bytes:

>>> sys.getsizeof('''') 37

Para cadenas unicode el tamaño por carácter va hasta 2 o 4 (dependiendo de las opciones de compilación). En Python 3.3 y posteriores, las cadenas Unicode ocupan entre 1 y 4 bytes por carácter, dependiendo del contenido de la cadena.

Cuando ejecuto el código a continuación, obtuve 3 y 36 como respuesta.

x ="abd" print len(x) print sys.getsizeof(x)

¿Alguien puede explicarme cuál es la diferencia entre ellos?