2010-10-25 20 views
46

Bir dizenin bellekte kaç bayt kaç tane olduğunu söyleyecek bir işlevi var mı?Bir dize kaç bayta sahip

Bütün dizeyi bir kerede aktarmak için bir yuva arabellek boyutu belirlemeliyim. len(s) gibi bir şey yeterli olacaktır böylece

+6

: Çin olanlar 3 bayt her kullandığınızda ise

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

:


Örneğin, ASCII karakterleri 1 bayt her kullandığınızda bellekte değil, belirli bir kodlamada ne kadardır. Her zamanki yol, dizgeyi (örneğin, UTF-8) aktarmanız gereken kodlamada bir bayt dizisine (muhtemelen Python'da bayt dizisi) dönüştürmek ve uzunluğu elde etmek olacaktır. – Joey

+3

Yerleşik len() hakkında nasıl? – gimel

+0

@Joey: Seni anlamıyorum, neden kodlamanın uzunluğu olduğunu düşünüyorsun? Hatta aynı konuyla karşılaşıyorum, tel üzerinden gönderilecek (string) içeriklerin boyutunu bilmek zorundayım. Gerçekten ihtiyacım olan şey, bayt cinsinden, bu dizgenin uzunluğuyla ne yapardım? – 0xc0de

cevap

57
import sys 
sys.getsizeof(s) 

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

Ama aslında, onun temsil uzunluğunu bilmemiz gerekir.

+1

+1. Bu, nesneyi temsil etmek için tüm ekstra bagajı iade etmez mi? PyObject'deki alanların geri kalanı. –

+3

@Noufal - tam olarak. Basit bir 'a' dizesi için 41 değerini döndürür. – eumiro

+1

Benim 'a' 25 bayta ihtiyaç duyar; Bu yüzden ya 64-bit Python'u çalıştırıyorsunuz ya da kullandığım yazı tipi daha basit vuruşlara sahip oluyor :) – tzot

57

Bu bir Python 2.x str ise, len olsun. o tercih kodlamayı kullanarak (sırasıyla veya str,) bir Python 3.x str (veya bir Python 2.x unicode), birinci kodlama yapın bytes içelim ('utf-8' iyi bir seçimdir) ve sonra/kodlanmış bayt len olsun str nesnesi. Yani dize boyutu hakkında ilgilendirmiyor

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

Gerçekten de bu doğru cevap. Bu 'sys.getsizeof()' size istediğiniz şeyi vermez. Yani, eğer utf-8 kodlanmış bir dizginiz varsa, len (myString) 'i yerine, sadece“ len (myString.encode ("utf8")) ' – Tom

+1

Bu doğru cevap olmalıdır. Dize, unicode ya da değil için tam olarak kaç bayta ihtiyacınız olduğunu söyleyecektir. Yine de, dizgenin iletilmek üzere baytlara kodlanması için iyi bir şans var, bu yüzden bir performans isabeti olabileceğinden şüpheliyim. – Taywee

İlgili konular