編寫網頁應用的語言多不勝數,人們總喜歡拿來互相比較,初學者也有興趣知道不同語言的特性,這次我們介紹 Ashish 所寫的「PHP 碰上 Python」,從語言特性到執行效能,比較 PHP 和 Python 兩種語言。
我們根據什麼來判斷一種編程語言比另一種好?有人說是靈活性、開發環境的友善程度、牌照政策(開源的或商業性的)、社區、可移植性、動態數據類型、支援不定數目的函式參數、把物件表達為一串字符的能力等等,文檔當然也是重要的因素,特別是當你尚未熟悉這種語言而需要提升你的技巧的時候。
支持 PHP 的特色:
- 語法很接近 C 和 Perl,使用 { } 和 $ 符號
- 使用類似 C 語言的 switch 語句和 do....while 結構
- 遞增、遞減及指定運算元
- 三元運算元/語句(... ? ... : ...)
- 缺乏組織的函式名稱,目前 PHP 沒有命名空間,函式往往靠名稱的字首來標識其來源(但經常都沒有字首),有些人把函式放入類別中來模擬命名空間
- 一種非常隨意的編程語言,全域變量經常被用作函式的引數(全域變量不應如此使用的,那不是 PHP 的錯)
- 在很多系統中已經預先安裝
- 別名(「$a =& $b」表示當 $b 改變,$a 也隨之改變)(應該叫作「參考」而不是「別名」,但 PHP 就是這樣叫)
- 一種陣列類型,可作為一串值,也可作為一串「鍵/值」組
- 出色的文檔
- 龐大的用戶社區,網上有極龐大的源碼庫
支持 Python 的特色
- 命名空間及模塊
- 細小的核心
- 透過縮排來標誌區塊結構,不使用大括號,使程式碼看起來更漂亮
- 清楚、簡潔的語法
- 藉著 docstrings 及 pydoc 自動產生文檔(PHP5 有 reflection 及 doc strings)
- 真正的物件導向,及「first class」類別和函式
- 在標準函式庫中大量使用類別
- 多重繼承
- 物件導向方式的文件處理
- 方法鏈
- 一切東西都是參考
- 所有數據類型都可以使用「del」語句
- 一致的大小寫區分政策(PHP 只對變量名稱分大小寫,函式名稱不分大小寫)
- 簡單的陣列切片語法
- 反覆器(只出現在 PHP5)
- 結構化異常處理(只出現在 PHP5)
- 操作符超載
- 線程
- 大量高層次的數據類型(列表、元組、字典、陣列等)
- 日期不受 Unix 的時間戳記所限(<1970, >2038)
- 支援所有主要的圖形用戶介面架構
- 強大的國際化和 Unicode 支援
- 成熟、穩定和向上兼容
- 往往導致更多的可擴展性應用
與 PHP 那樣把網頁開發功能直接建在語言核心不同,Python 藉著附加模塊來提供網頁開發能力,基本 CGI 模塊提供基本的 CGI 功能,它是隨 Python 而來的標準函式庫一部份,Python 還有大量由第三方提供的模塊,有些是相輔相成,有些互相競爭,由此產生了一個更靈活的網頁開發基礎。
這種靈活性是有代價的,首先,可選擇的範圍可能令人困惑,除非你是經驗豐富的 Python 開發者,否則 PHP 會更容易上手。其次,在共享伺服器的環境,PHP 比 Python 更常見。
另一個不同之處是,PHP 是嵌入網站伺服器中,而 Python 的應用程式則可能同樣地嵌入在網站伺服器,也可能是一個單獨的進程。
現在我們比較一下兩種語言找尋 10000 以下所有質數的速度,每一個測試都會執行三次,以優化測試的結果。
$ time ./script.php
語言 | 程式碼 1 | 程式碼 2 | 程式碼 3 |
PHP | 1.359 | 1.753 | 1.191 |
Python | 1.894 | 1.636 | 1.634 |
結果似乎表明 PHP 比 Python 執行得更快,不過要注意一點,PHP 在執行短小的程式碼時比較快,但當我們討論到可擴展的大型系統時,Python 有更好的效能。尋找 10000 之內的質數是很短小的程式碼,這正好解釋了為何大多數小型的網頁應用都使用 PHP,PHP 得到幾個巨頭的採用也是原因之一。
我們再做一個牽涉數學運算的速度比較。測試用的程式碼包含一個 2,000,000 次的迴路,每次計算 N + N 的 MD5 散列值,其中 N 是迴路的執行次數。
結果:
語言 | 第一次 | 第二次 | 第三次 | 第四次 |
PHP | 21.4227 | 21.1122 | 9.811 | 9.857 |
Python | 9.8737 | 9.7241 | 4.429 | 4.280 |
可以看到,執行這類操作時 Python 比 PHP 快兩倍以上,這在接近執行一個數學算法時優勢更加明顯。
有人認為,Python 是為數學算法而優化的,所以在這方面輕易把 PHP 擊倒,但如果比較兩種語言在同一時間內可以產生多少網頁,PHP 明顯快得多。
其他比較編程語言的重要因素包括:
執行速度
對於相當複雜的工作,兩種語言均沒有明顯的優勢,每一種都在特定的工作有較好的效能,所以可以說,99% 情況下我們無須理會哪一種執行得較快。
編寫的速度
假設兩種語言都以一個可接受的速度運行(事實上的卻如此),這就是第二個最重要的指標,Ashish 承認他對 Python 的熟悉程度不能夠公平地判斷哪一種語言的編寫速度較快,但他認為,迄今為止 Python 似乎更快。
容易維護
雖然 Ashish 使用 Python 的時間不夠長,但他很自信的認為 Python 的程式更容易維護。雖然 Ashish 在編寫 PHP 時必定會縮排,但他更喜歡 Python 無須大括號而強制縮排的語法,他也喜歡 Python 的作用領域存取語法多於 PHP(object.property 相對 $object->property)。當然這些都是個人品味的問題,如何取捨還是由你來決定。
易於安裝/可移植性
這裡 PHP 取勝了,在 PHP 中你無須像 Python 那樣自行輸出 HTTP headers,大多數的服務供應商都支援 PHP,PHP 也更易於連接到數據庫,網上也似乎有更多相關的教學文件。
支援/社區
Ashish 認為 PHP 的社區和支援都比較優勝,但同時他注意到大量 Python 社區正提供日益成熟的支援。
其他參考資料
以下是 Ashish 認為不錯的編程語言比較:C++ / Java / Python / Ruby / Jython / JRuby / Groovy 效能比較
結論
鑒於 Python 在開發可擴展應用程式的優勢,Ashish 會選取 Python,這不是說 PHP 不能用來開發這類應用程式,只是 Python 比較容易。而且 Google 的 Google App Engine 支援 Python,Python 編寫的網站可以在 Google 伺服器上免費寄存,它也支援 Python 開發架構 Django,所以 Ashish 寧可投資在 Python 上。另一方面 PHP 擁有 60% 的市場,快將推出的新版本(PHP6)肯定會加入命名空間、高層次的數據結構等,令兩者的差距縮窄。