網頁

搜尋此網誌

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指的就是這些標準程式庫,這些標準程式庫都是一般普遍常用的功能,能夠立即解決功能上的需求,因此開發時不太需要額外安裝其他程式庫。

###

2013年4月23日 星期二

The $100 Startup 小資創業老闆的實戰成功術

近一兩年以來,出現很多創業與創投的相關書籍,這些書多半討論科技網路方面的創業內容(例如成立網路公司、利用創投基金開始...),對於不是在科技網路領域創業的人而言,這些書的幫助有限。

現在「3000元開始的自主人生」這本以相當務實的角度出發,利用「小資(即書名的$100美金)」開始自己的「微型創業」之路,作者古利博(Chris Guillebeau)訪問相當多的微型創業老闆,分析並研究這些創業歷程,他找出實際可行的方法,在書中教導大家如何從事自己所愛的事情,以及如何創造「錢途」,這本書不講高深複雜的商業知識,而是提供立即可用的實戰技術。


古利博(Chris Guillebeau)著,連育德譯,3000元開始的自主人生:50位小資創業老闆的實戰成功術,台北市:天下遠見,2013。
譯自:The $100 Startup: reinvent the way you make a living, do what you love, and create a new feature

整本書的架構分成三部曲共14章,「創業首部曲」主要是建立正確的小資創業觀念,自己創業是為了什麼?為了做自己想要的事情(興趣),還是因為意外解雇而不得不的選擇之一,不管為何,創業是為了追尋自己所要的自由,而創造價值則是通往成功創業的途徑。

這本書最重要的一點是;「唯有提供價值給別人,才能獲得工作自由。」利用自己的專長或興趣去創造出別人所需要的產品或服務,這是微型創業成功的關鍵!如何提供別人所需的價值呢?這本書都有一些方法讓你找出來。

「創業二部曲」則是討論創業之後的工作,主要以行銷方面為主,如何開始第一筆生意,如何讓別人知道你的服務或產品,還有重要的訂價策略,價格取決於你提供的價值,而不是工作的時間。最後「創業三部曲」是討論創業上軌道後的事情,例如事業如何持續成長,商業模式的規劃等。

###

2013年4月19日 星期五

amazon.com的秘密

這是一本講述亞馬遜公司(amazon.com)從創業至成功的故事書,輕鬆地閱讀這本書來認識amazon.com,瞭解它成功的原因,為何貝佐斯(Jeffrey Preston Bezos)要從賣書這個領域開始,時間若回到亞馬遜創立的1994年,就不得不佩服他洞燭先機!

貝佐斯發現當時網際網路一年是成長23倍,他認為快速成長就代表無限商機,分析潛力商品發現賣書是最有機會的一條路,因為書本市場夠大、易於運送、不需庫存...等,加上書本的資料非常容易用電腦與網路去搜尋和管理,顧客可以用網路找書、買書。天時地利之下,貝佐斯本身也是個聰明人,也喜歡閱讀,最重要的一點,顧客至上,「點一下還不夠」,提供客戶更好的服務,這也是所有成功企業的重要基本要素,從下面這段話可以看到。

「我們要成為全世界最重視顧客的企業,無論人們想要在網路上買什麼東西,都可以在我們的網站上找到。」亞馬遜的企業使命 p. 33


理察‧布蘭特(Richard L. Brandt)著,閻紀宇譯,amazon.com的秘密,台北市,天下雜誌,2012。
譯自:One Click: Jeff Bezos and the Rise of Amazon.com

書中除了敘述這些成功過程之外,部分也描述亞馬遜如何壓榨員工的故事,也有商場上競爭的故事,整體而言,這本書完整而有秩序的介紹亞馬遜,閱讀上建議從頭開始讀起。

最後,書中附錄有一段「貝佐斯2010年普林斯頓大學畢業演講摘錄」,這段演講也可以在TouTube上看到完整演說。


貝佐斯(Jeff Bezos):仁慈比聰明困難。(It is Harder to be Kind than Clever.)...聰明是天賦,仁慈是選擇。天賦與身俱來,但是選擇就難了。如果不小心,你們可能就會被聰明誘使做了傷害仁慈的選擇。

###

2013年4月8日 星期一

Clean Code 無瑕的程式碼

最近這本『無瑕的程式碼』非常熱門!除了廣告打的兇之外(暢銷的書總是一開始就暢銷),重點在於作者和書的內容,Bob 大叔 (即Robert C. Martin) 也是另一本經典著作『敏捷軟體開發:原則、樣式及實務』的作者,不論你是否認同敏捷軟體開發 (Agile Software Development),只要是撰寫程式的軟體開發人員都要好好閱讀這本 Clean Code,因為我相信大家都會遇到這樣的事情:

公司急於讓產品完成上市,導致程式碼慢慢變得一團亂。加入越來越多的功能,程式碼越來越糟糕。每次修改程式也讓程式碼更加混亂、曲折及可怕,程式碼越來越龐大、艱深且複雜。

生產力漸漸降低,於是管理者想辦法招募更多新員工,由於新員工不知原始系統的設計,因而修改將破壞原本設計的原意,程式碼趨近崩解的邊緣。於是開發人員提出無法在現有設計上繼續開發下去,新的專案油然而生...持續陷入永無止境的迴圈之中,總是希望下一個軟體專案會更好。

這樣的問題到底出在哪裡?


Robert C. Martin 著,戴于晉、博碩文化編譯,無瑕的程式碼:敏捷軟體開發技巧守則,新北市:博碩文化,2013。
譯自:Clean Code: a handbook of agile software craftsmanship

作者 Martin 先生認為在於軟體開發人員(程式設計師)的態度,程式設計師沒有專業的把程式碼撰寫優良,導致劣質的程式碼慢慢腐蝕軟體的進度和品質,解決之道是『Clean Code』!

Bob 大叔將本書分成3大部分,第一部份(第1至第10章)說明什麼是無瑕的程式碼與 Clean Code 的原則、模式和實踐方式,第二部份(第11至第16章)則是以一些案例進行討論程式碼的清理 (clean)。最後第三部份(第17章)則是『程式碼氣味型錄』,記錄這本書中 Clean Code 的心得,這部份算是重點整理。(在序中沒有明確說明章節是第幾部分,這裏是看內容後自己劃分的)

整本書相當精彩,閱讀起來也相當舒適,可以感覺博碩文化出版的用心。書中提到博碩文化在這個『名家名著系列』 的願景,這裡不得不推崇一下出版社的堅持和貢獻,希望未來台灣與華人地區有更多經典著作的中文翻譯書籍。

###

2013年4月5日 星期五

Virtualization 虛擬化技術

這篇文章將簡述虛擬化技術(virtualization),主要目的是將一些觀念說明清楚,因為現在大家對於虛擬化好像都只知道CPU的虛擬化,其實虛擬化的範圍很廣,有必要讓大家都知道。主要參考資料是『雲端策略』這本書,由陳瀅 等著,天下文化所出版。

虛擬化概念是在1950年代首次提出,到1960年代才在IBM大型主機上實現商用。電腦系統之所以可以虛擬化,原因在於電腦系統分為若干層次,在這些不同層次之間建構虛擬化層,對使用者提供與真實系統相同或類似的功能,使得上層系統可以運行在該中間層(虛擬化層)之上。由於中間層解除上下兩層間原本存在的耦合關係,使上層的運行不依賴下層的具體實作方式。

虛擬化的對象主要是各式各樣的電腦資源,經過虛擬化後的邏輯資源對使用者隱藏了不必要的細節,使用者可以在虛擬環境中實現其在真實環境中的部分或者全部功能。以電腦資源區分虛擬化技術有:
  • 硬體資源
    • CPU虛擬化
      • 軟體:全虛擬化(Full Virtualization)、半虛擬化(Para-Virtualization)
      • 硬體(硬體輔助虛擬化,hardware assisted virtualization ):Intel®VTAMD-V™
    • 記憶體虛擬化(虛擬記憶體)
      • 影子分頁表法
      • 分頁表寫入法
    • I/O虛擬化
    • 伺服器虛擬化:CPU虛擬化+記憶體虛擬化+I/O虛擬化
      • 原生虛擬化:虛擬化平台(hypervisor)
      • 寄宿虛擬化:虛擬機監視器(Virtual Machine Monitor, VMM)
    • 儲存虛擬化
      • 基於儲存設備虛擬化:磁碟陣列(Redundant Array of Inexpensive Disks, RAID)
      • 基於網路虛擬化:網路附加儲存(Network Attached Storage, NAS)與儲存區域網(Storage Area Network, SAN)
    • 網路虛擬化
      • 區域網路虛擬化:虛擬區域網路(Virtual LAN, VLAN)
      • 廣域網路虛擬化:虛擬私有網路(Virtual Private Network, VPN)
  • 軟體資源
    • 作業系統虛擬化
    • 檔案系統虛擬化
    • 桌面虛擬化(Desktop Virtualization)
    • 應用程式虛擬化(Application Virtualization)
    • 高階語言虛擬化
可以看到在CPU虛擬化的部份,一般大家說的全虛擬化、半虛擬化是指用軟體去模擬CPU,顯然這種方式一定比硬體輔助虛擬化的方式效率要差,目前幾乎都是使用硬體輔助虛擬化。注意到,除了CPU虛擬化之外,其實還有記憶體虛擬化、I/O虛擬化、儲存虛擬化、網路虛擬化等不同的資源虛擬化,不要只認為虛擬化都是指硬體CPU的部份,這是不完整的觀念!

###

2013年4月2日 星期二

Catalog of Design Patterns 設計模式型錄

這裡將列出物件導向程式設中的「設計模式」型錄,資料是節錄自「物件導向設計模式:可再利用物件導向軟體之要素(Design Patterns: Elements of resuable object-oriented software)」這本書的內容,此書作者是Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides著(所稱「四人幫」),由葉秉哲先生所翻譯,台灣培生教育出版,可以在天瓏書局購買(好像也只有天瓏有賣)。

下列型錄包含3大類共23個設計模式,並列出其目的。

生成模式(Creational Patterns)
將物件具現化的過程抽象化地加以萃取,使系統能獨立於物件的建立、組成及表現方式之外。
  • 工廠方法模式(Factory Method)
    定義可資生成物件的介面,但讓子類別去決定該具現出哪一種類別的物件。此模式讓類別將具現化程序交付給子類別去處置。
  • 抽象工廠模式(Abstract Factory)
    以同一個介面來建立一整族相關或相依的物件,不需點明各物件真正所屬的具象類別。
  • 建造者模式(Builder)
    從複雜物件的佈局中抽取出生成程序,以便用同一個生成程序製造各種不同的物件佈局。
  • 原型模式(Prototype)
    制訂可用原型個體生成的物件類型,爾後只須複製此原型即可生成新物件。
  • 獨體模式(Singleton)
    確保類別只會有一個物件實體存在,並提供單一存取窗口。

結構模式(Structural Patterns)
在探討如何以類別和物件組合成大型的結構。
  • 轉接器模式(Adapter)
    將類別的介面轉換成外界所預期的另一種介面,讓原先囿於介面不相容問題而無法協力合作的類別能夠兜在一起用。
  • 橋接模式(Bridge)
    將實作體系與抽象體系分離開來,讓兩者能各自更動各自演進。
  • 組合模式(Composite)
    將物件組織成樹狀結構、「部分─全體」層級關係,讓外界以一致性的方式對待個別物件和整體物件。
  • 裝飾模式(Decorator)
    將額外權責動態附加於物件身上,不必衍生子賴別即可彈性擴增功能。
  • 外觀模式(Façade)
    替子系統裡一堆介面定義一套統一的高階介面,讓子系統更易使用。
  • 享元模式(Flyweight )
    以共享機制有效地支援一大堆小規模的物件。
  • 代理模式(Proxy)
    替其他物件預留代理者空位,藉此控制存取其他物件。

行為模式(Behavioral Patterns)
探討物件之間的演算法及權責分配問題。
  • 解譯器模式(Interpreter)
    針對標的語言定義出文法,以及可解讀這種語句的解釋器。
  • 範本方法模式(Template Method)
    對於操作,只先定義好演算法的輪廓,某些步驟則留給子類別去填補,以便在不改變演算法整體構造的情形下讓子類別去精鍊某些步驟。
  • 職責鏈模式(Chain of Responsibility)
    讓多個物件都有機會處理某一訊息,以降低訊息發送者和接收者之間的耦合關係。它將接收者物件串連起來,讓訊息流經其中,直到被處理了為止。
  • 命令模式(Command)
    將訊息封裝成物件,以便能用各種不同訊息、暫存、記錄、復原等方式加以參數化處理。
  • 迭代器模式(Iterator)
    毋須知曉聚合物件的內部細節,即可依序存取內含的每一個元素。
  • 仲介者模式(Mediator)
    定義可將一群物件互動方式封裝起來的物件。因為物件彼此不直接相互指涉,所以耦合性低,容易逐一變更互動關係。
  • 備忘錄模式(Memento)
    在不違反封裝性的前提下,捕捉物件的內部狀態並存在外面,以便日後回復至此一狀態。
  • 觀察者模式(Observer)
    定義一對多的物件依存關係,讓物件狀態一有變動,就自動通知其他相依物件作該做的更新動作。
  • 狀態模式(State)
    讓物件的外顯行為隨內部狀態改變而改變,彷彿連類別也變了似的。
  • 策略模式(Strategy)
    定義一整族演算法,將每一個演算法封裝起來,可互換使用,更可在不影響外界的情況下個別抽換所引用的演算法。
  • 訪問者模式(Visitor)
    定義能逐一施行於物件結構裡各個元素的操作,讓你不必修改作用對象的類別介面,就能定義新的操作。
對於上述設計模式的目的說明,看完與看懂是兩種不同的境界,若以投手與捕手做例子,看完23個設計模式就像捕手可以接到投手所投的球,但這不表示捕手知道投手為什麼會投這樣的球,看懂則是進入知其然的境界了。

###

熱門文章