網頁

搜尋此網誌

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

###

2013年5月14日 星期二

Visualization of Python’s built-in exceptions 視覺化Python內建例外

修改前一篇的程式碼,可以得到內建例外(Built-in Exceptions)的繼承關係。

if __name__ == "__main__":
    import types
    import gv
    g = gv.digraph('exceptions')
    gv.setv(g, 'overlap', 'false')
    gv.setv(g, 'splines', 'true')
    gv.setv(g, 'pad', '1')
    for item in dir(__builtins__):
        attr = getattr(__builtins__, item)
        if type(attr) is types.TypeType and \
           issubclass(attr, BaseException):
            tail = None
            head = None            
            for i in attr.__mro__:
                nodename = i.__name__
                tail = gv.findnode(g, nodename)
                if not tail:
                    tail = gv.node(g, nodename)
                if head and not gv.findedge(tail, head):
                    gv.edge(tail, head)
                head = tail
    
    gv.layout(g, 'neato')
    gv.render(g, 'png', 'built-in_exceptions.png')

視覺化結果如下圖所示:(大圖連結)

由圖上可以看到,例外物件的基底類別是BaseException,而Exception繼承BaseException,提供給所有內建的、系統的與使用者定義的例外去繼承Exception,這裡可以看到Python例外分成兩大類,一個是StandardError,另一個是Warning

###

2013年5月13日 星期一

Visualization of Python’s built-in types 視覺化Python內建型別

利用Graphviz軟體可以將結構性資料用圖形呈現,這裡將以圖形繪製Python內建型別的繼承關係,我使用Graphviz的Python API輸出PNG圖形,程式碼如下:

if __name__ == "__main__":
    import types
    import gv
    g = gv.digraph('types')
    gv.setv(g, 'overlap', 'false')
    gv.setv(g, 'splines', 'true')
    for item in dir(__builtins__):
        attr = getattr(__builtins__, item)
        if type(attr) is types.TypeType and \
           not issubclass(attr, BaseException):
            tail = None
            head = None            
            for i in attr.__mro__:
                nodename = i.__name__
                tail = gv.findnode(g, nodename)
                if not tail:
                    tail = gv.node(g, nodename)
                if head and not gv.findedge(tail, head):
                    gv.edge(tail, head)
                head = tail
    
    gv.layout(g, 'neato')
    gv.render(g, 'png', 'built-in_types.png')

執行完畢之後,將會在程式同一路徑下產生一個檔名為built-in_types的PNG檔。

從這張圖可以看到所有的型別都是繼承至object類別。

###

2013年5月6日 星期一

安裝Python

記錄Python安裝過程與套件管理工具的安裝。

Linux (Ubuntu Distribution)平台,以Ubuntu 12.04 LTS為例。
  • 內建已經安裝Python 2.7。
  • 安裝套件管理工具,指令:sudo apt-get install pip。
Windows平台,以Windows 7 64-bit為例。
  • 下載python-2.7.3.amd64.msi,執行安裝,預設路徑安裝至C:\Python27。
  • 下載setuptools,由於64位元系統沒有MSI安裝精靈,請下載ez_setup.py,使用python.exe執行,指令:C:\Python27\python.exe ez_setup.py
  • 利用easy_install.exe安裝套件管理工具,指令:c:\Python27\Scripts\easy_install.exe pip
在Windows上也可以用pip喔!

如果在開發Python應用程式有需要任何套件,都可以使用「pip install 套件名稱」進行下載安裝(前提是要可以上網),非常方便。

###

徹底研究Python:談標準程式庫

徹底研究Python:談標準程式庫(standard library)。

Pyhton提供的標準程式庫相當多,去除特定平台,大致上可以分成26類服務,大概有239個模組。
  1. String Services (11)
  2. Data Types (19)
  3. Numeric and Mathematical Modules (9)
  4. File and Directory Access (12)
  5. Data Persistence (13)
  6. Data Compression and Archiving (5)
  7. File Formats (6)
  8. Cryptographic Services (4)
  9. Generic Operating System Services (17)
  10. Optional Operating System Services (9)
  11. Interprocess Communication and Networking (7)
  12. Internet Data Handling (16)
  13. Structured Markup Processing Tools (15)
  14. Internet Protocols and Support (25)
  15. Multimedia Services (10)
  16. Internationalization (2)
  17. Program Frameworks (2)
  18. Graphical User Interfaces with Tk (5)
  19. Development Tools (5)
  20. Debugging and Profiling (5)
  21. Python Runtime Services (17)
  22. Custom Python Interpreters (2)
  23. Restricted Execution (2)
  24. Importing Modules (7)
  25. Python Language Services (13)
  26. Miscellaneous Services (1)

詳細的說明可以參閱官網的The Python Standard Library。這理必須提到Python的哲學,Python具有「batteries included」,battery指的就是這些標準程式庫,這些標準程式庫都是一般普遍常用的功能,能夠立即解決功能上的需求,因此開發時不太需要額外安裝其他程式庫。

###

熱門文章