您誤解了什麼sys.getsizeof()
確實。它返回Python用於字符串對象的內存量,而不是行的長度。
Python字符串對象跟蹤引用計數,對象類型和其他元數據連同實際字符,所以2978字節是而不是與字符串長度相同。
見stringobject.h
definition of the type:
typedef struct {
PyObject_VAR_HEAD
long ob_shash;
int ob_sstate;
char ob_sval[1];
/* Invariants:
* ob_sval contains space for 'ob_size+1' elements.
* ob_sval[ob_size] == 0.
* ob_shash is the hash of the string or -1 if not computed yet.
* ob_sstate != 0 iff the string object is in stringobject.c's
* 'interned' dictionary; in this case the two references
* from 'interned' to this object are *not counted* in ob_refcnt.
*/
} PyStringObject;
其中PyObject_VAR_HEAD
在object.h
,其中標準ob_refcnt
,ob_type
和ob_size
字段都被定義定義。
所以一個長度爲2957的字符串需要2958個字節(字符串長度爲空),其餘的20個字節用於保存引用計數,類型指針,對象'size'(字符串長度),緩存字符串散列和interned狀態標誌。
其他對象類型將具有不同的內存佔用,並且所使用的C類型的確切大小也因平臺而異。
你在用什麼'sys.getsizeof'? – hobbs 2014-10-31 17:52:48
@hobbs我沒有特別使用它,我只是注意到了這種差異,並想知道爲什麼是這種情況 – samuelschaefer 2014-10-31 17:58:46
所有這些與文件I/O無關;你會得到'line =''* 2957'的相同結果。 – 2014-10-31 18:13:24