2011-10-15 91 views
6
>>> sys.getsizeof(int) 
436 #? does this mean int occupies 436 bytes . 

>>> sys.getsizeof(1) 
12 #12 bytes for int object, is this the memory requirement. 

我想INT在Python是由4個字節表示使用的一種類型的確切大小,它爲什麼報告12個字節我怎麼能確定由蟒蛇

請有人解釋爲什麼會報到時12個字節int只使用4個字節

+0

可能的重複[如何在Python中剖析內存使用情況?](http://stackoverflow.com/questions/552744/how-do-i-profile-memory-usage-in-python) –

+0

此外,這一個](http://stackoverflow.com/questions/110259/python-memory-profiler)。基本上,這裏鏈接的工具(Heapy)是Python中內存分析的論文的一部分。如果你真的想知道,請檢查一下。 –

回答

10

是的,int實例在系統上佔用12個字節。整數(與任何對象一樣)具有屬性,即指向其他對象的指針,這些指針佔用超出對象自身值所使用的內存空間的額外內存空間。因此4個字節表示整數的值,4個字節表示指向__class__的指針(否則,Python不知道該對象屬於何種類型,以及如何開始解析從int類及其父項繼承的屬性名稱),以及另一個4表示垃圾回收器使用的對象引用計數。

int類型在您的系統上佔用436個字節,這將指向各種方法和int類的其他屬性以及Python對該類需要的其他任何內務信息。在標準的Python實現中,類C是用C語言編寫的;您可以查看源代碼並查看其中的內容。

+1

什麼救濟....感謝解釋。 – George

+0

Python不像其他一些語言(ruby,lisp)那樣使用對象指針中的特殊位來存儲(足夠小的)整數,所以它們使用了大量的內存來處理純整型。如果12個字節對​​您來說太多了,並且您想要存儲大型整數數組,請查看numpy的特殊數組。 –

+0

@eryksun:或者考慮如果array.append沒有過度分配,或者讀取數據源(arraymodule.c),它的平均性能會有多糟糕。 –

2

從文檔sys.getsizeof

getsizeof()調用對象的方法__sizeof__,如果對象是由垃圾收集管理增加了一個額外的垃圾收集器的開銷。

這可能是爲什麼sys.getsizeof(1)給你12個字節。至於你的第一線,牢記int對象是什麼:

>>> int 
<type 'int'> 

int是整數類型本身,而不是一個整數。 python中的一個整數實際上佔用了所需的儘可能多的字節數(這就是爲什麼你不需要擔心溢出),而類型是處理所有這些功能的地方。我相信這種區別只適用於內置類型,對於用戶定義的對象,類型本身可能與該類型的實例具有相似的大小。