網頁

搜尋此網誌

2013年5月16日 星期四

Size of Python built-in types 內建型別大小

利用sys模組的getsizeof函式,可以取得Python物件的大小。這裡我用來取得Python內建型別的物件大小,用來分析一個最基本的型別物件(實體化物件,不指定初值)之成本(overhead),各型別物件的大小如下表所述。

TypeSize (Bytes)
bool24
bytearray48
bytes37
complex32
dict280
float24
frozenset232
int24
list72
long24
object16
property88
set232
str37
tuple56
unicode52

可以看到萬物基礎的object物件,其初始大小是16 bytes,其他物件都是繼承至object類別,因此物件不會比「object」小。最大的型別物件是280 bytes,dict用起來非常方便,用key就能取得value,但要注意「成本」,撰寫程式時務必選擇適當的型別,才不會造成記憶體的浪費(雖然,現在記憶體都是1~2GB以上)。

從這個表格也可以看到一件事,可變更(mutable)的物件普遍比不可變更(immutable)來得大,例如「list」比「tuple」大,而「bytearray」比「str」大,如果撰寫程式時不會變更其值,不妨使用較「經濟」的型別!

計算上述物件成本是用程式撰寫而產生,其程式碼如下:

if __name__ == "__main__":
    import types
    import sys
    tbody='<tr><th>Type</th><th>Size (Bytes)</th></tr>'
    for item in dir(__builtins__):
        attr = getattr(__builtins__, item)
        if type(attr) is types.TypeType and \
           not issubclass(attr, BaseException):
            try:
                obj =attr()
                tbody +='<tr><td>%s</td><td>%s</td></tr>' %\
                      (item, sys.getsizeof(obj))
            except TypeError:
                pass
    table = '<table border="1" cellpadding="5" style="width: 80%%;">%s</table>' % tbody
    print table

###

沒有留言:

張貼留言

熱門文章