Python
Python的優缺點
程式設計問答
優點
1.簡單————Python是一種代表簡單主義思想的語言。閱讀一個良好的Python程式就感覺像是在讀英語一樣,儘管這個英語的要求非常嚴格!Python的這種虛擬碼本質是它最大的優點之一。它使你能夠專注於解決問題而不是去搞明白語言本身。
2.易學————就如同你即將看到的一樣,Python極其容易上手。前面已經提到了,Python有極其簡單的語法。
3.免費、開源————Python是FLOSS(自由/開放原始碼軟體)之一。簡單地說,你可以自由地釋出這個軟體的拷貝、閱讀它的原始碼、對它做改動、把它的一部分用於新的自由軟體中。FLOSS是基於一個團體分享知識的概念。這是為什麼Python如此優秀的原因之一——它是由一群希望看到一個更加優秀的Python的人創造並經常改進著的。
4.高層語言————當你用Python語言編寫程式的時候,你無需考慮諸如如何管理你的程式使用的記憶體一類的底層細節。
5.可移植性————由於它的開源本質,Python已經被移植在許多平臺上(經過改動使它能夠工作在不同平臺上)。如果你小心地避免使用依賴於系統的特性,那麼你的所有Python程式無需修改就可以在下述任何平臺上面執行。這些平臺包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至還有PocketPC、Symbian以及Google基於linux開發的Android平臺!
6.解釋性————這一點需要一些解釋。一個用編譯性語言比如C或C++寫的程式可以從原始檔(即C或C++語言)轉換到一個你的計算機使用的語言(二進位制程式碼,即0和1)。這個過程通過編譯器和不同的標記、選項完成。當你執行你的程式的時候,連線/轉載器軟體把你的程式從硬碟複製到記憶體中並且執行。而Python語言寫的程式不需要編譯成二進位制程式碼。你可以直接從原始碼 執行 程式。在計算機內部,Python直譯器把原始碼轉換成稱為位元組碼的中間形式,然後再把它翻譯成計算機使用的機器語言並執行。事實上,由於你不再需要擔心如何編譯程式,如何確保連線轉載正確的庫等等,所有這一切使得使用Python更加簡單。由於你只需要把你的Python程式拷貝到另外一臺計算機上,它就可以工作了,這也使得你的Python程式更加易於移植。
7.物件導向————Python既支援程式導向的程式設計也支援物件導向的程式設計。在“程式導向”的語言中,程式是由過程或僅僅是可重用程式碼的函式構建起來的。在“物件導向”的語言中,程式是由資料和功能組合而成的物件構建起來的。與其他主要的語言如C++和Java相比,Python以一種非常強大又簡單的方式實現物件導向程式設計。
8.可擴充套件性————如果你需要你的一段關鍵程式碼執行得更快或者希望某些演算法不公開,你可以把你的部分程式用C或C++編寫,然後在你的Python程式中使用它們。
9.可嵌入性————你可以把Python嵌入你的C/C++程式,從而向你的程式使用者提供指令碼功能。
10.豐富的庫————Python標準庫確實很龐大。它可以幫助你處理各種工作,包括正規表示式、文件生成、單元測試、執行緒、資料庫、網頁瀏覽器、CGI、FTP、電子郵件、XML、XML-RPC、HTML、WAV檔案、密碼系統、GUI(圖形使用者介面)、Tk和其他與系統有關的操作。記住,只要安裝了Python,所有這些功能都是可用的。這被稱作Python的“功能齊全”理念。除了標準庫以外,還有許多其他高質量的庫,如wxPython、Twisted和Python影像庫等等。
概括————Python確實是一種十分精彩又強大的語言。它合理地結合了高效能與使得編寫程式簡單有趣的特色。
規範的程式碼————Python採用強制縮排的方式使得程式碼具有極佳的可讀性。
缺點
強制縮排
這也許不應該被稱為侷限,但是它用縮排來區分語句關係的方式還是給很多初學者帶來了困惑。即便是很有經驗的Python程式設計師,也可能陷入陷阱當中。最常見的情況是tab和空格的混用會導致錯誤,而這是用肉眼無法分別的。
單行語句和命令列輸出問題
很多時候不能將程式連寫成一行,如import sys;for i in sys.path:print i。而perl和awk就無此限制,可以較為方便的在shell下完成簡單程式,不需要如Python一樣,必須將程式寫入一個.py檔案。(對很多使用者而言這也不算是限制)
NO.1 執行速度,有速度要求的話,用C++改寫關鍵部分吧。
NO.2 國內市場較小(國內以python來做主要開發的,目前只有一些 web2.0公司)。但時間推移,目前很多國內軟體公司,尤其是遊戲公司,也開始規模使用他。
No.3 中文資料匱乏(好的python中文資料屈指可數)。託社群的福,有幾本優秀的教材已經被翻譯了,但入門級教材多,高階內容還是隻能看英語版。
NO.4 構架選擇太多(沒有像C#這樣的官方.net構架,也沒有像ruby由於歷史較短,構架開發的相對集中。Ruby on Rails 構架開發中小型web程式天下無敵)。不過這也從另一個側面說明,python比較優秀,吸引的人才多,專案也多。
perl
perl大勢已去,這裡就不多說了。
重點來說說Go 語言
Go
以下僅僅代表筆者個人觀點:
Go語言和Python 是目前的趨勢所向吧,雖然小編是從事JAVA開發,但是現在依然在學習Python,有時間也會整下Go
為什麼說Go 和Python是趨勢呢
先來說說Go語言:
Go優點:
1.部署簡單。Go 編譯生成的是一個靜態可執行檔案,除了 glibc 外沒有其他外部依賴。這讓部署變得異常方便:目標機器上只需要一個基礎的系統和必要的管理、監控工具,完全不需要操心應用所需的各種包、庫的依賴關係,大大減輕了維護的負擔。這和 Python 有著巨大的區別。由於歷史的原因,Python 的部署工具生態相當混亂【比如 setuptools, distutils, pip, buildout 的不同適用場合以及相容性問題】。官方 PyPI 源又經常出問題,需要搭建私有映象,而維護這個映象又要花費不少時間和精力。
2.併發性好。Goroutine 和 channel 使得編寫高併發的服務端軟體變得相當容易,很多情況下完全不需要考慮鎖機制以及由此帶來的各種問題。單個 Go 應用也能有效的利用多個 CPU 核,並行執行的效能好。這和 Python 也是天壤之比。多執行緒和多程式的服務端程式編寫起來並不簡單,而且由於全域性鎖 GIL 的原因,多執行緒的 Python 程式並不能有效利用多核,只能用多程式的方式部署;如果用標準庫裡的 multiprocessing 包又會對監控和管理造成不少的挑戰【我們用的 supervisor 管理程式,對 fork 支援不好】。部署 Python 應用的時候通常是每個 CPU 核部署一個應用,這會造成不少資源的浪費,比如假設某個 Python 應用啟動後需要佔用 100MB 記憶體,而伺服器有 32 個 CPU 核,那麼留一個核給系統、執行 31 個應用副本就要浪費 3GB 的記憶體資源。良好的語言設計。從學術的角度講 Go 語言其實非常平庸,不支援許多高階的語言特性;但從工程的角度講,Go 的設計是非常優秀的:規範足夠簡單靈活,有其他語言基礎的程式設計師都能迅速上手。更重要的是 Go 自帶完善的工具鏈,大大提高了團隊協作的一致性。比如 gofmt 自動排版 Go 程式碼,很大程度上杜絕了不同人寫的程式碼排版風格不一致的問題。把編輯器配置成在編輯存檔的時候自動執行 gofmt,這樣在編寫程式碼的時候可以隨意擺放位置,存檔的時候自動變成正確排版的程式碼。此外還有 gofix, govet 等非常有用的工具。
3.執行效能好。雖然不如 C 和 Java,但通常比原生 Python 應用還是高一個數量級的,適合編寫一些瓶頸業務。記憶體佔用也非常省。
對於GO語言,一直存在爭論,很多人善於利用GO語言進行開發,但並不是所有的人都喜歡Go語言,我們這個世界真的需要另外一種C語言風格的程式語言嗎,go語言可以做什麼?優勢在哪裡?
go語言可以做什麼?
根據谷歌著名的軟體工程師——Go語言的設計人之一——Rob Pike的說法,它是用來開發”大型軟體“的。
Pike說Go語言適合於”很多程式設計師一起開發的大型軟體,並且開發週期較長,支援雲端計算的網路服務:簡言之,就是服務端軟體。Go語言能夠讓程式設計師快速開發,並且在軟體不斷的增長過程中,它能讓程式設計師更容易地進行維護和修改。它融合了傳統編譯型語言的高效性和指令碼語言的易用性和富於表達性。“(作為原貝爾實驗室Unix開發小組成員,Pike對系統軟體有相當的認識。)
但對於其它型別的軟體,Go語言也一樣的好用。例如,我在Google+上詢問了Go語言的使用者,得到了Douglas Fils的回覆,他正在拿各種語言做實驗。
Fils說他現在有時會開發一些Web應用程式,大多數都是在Java虛擬機器(JVM)平臺上。“所以Java自然是最常用的。我最近開始嘗試更多的語言,例如Scala和Groovy。我用Groovy語言已經開發了不少的東西,而且剛剛完成了一個Groovy/Grails語言上的大型專案。我還研究了一下Ruby on Rails/Python(Python框架),並用它們做了一些東西。”
他說他用早期版本的Go語言開發了一個Web介面來處理資料資源。但很不幸。“當時的Go的程式庫和語法使得開發起來很困難。我還嘗試了node.js,而且,到了一月份,我的精力完全轉向了node.js.”
Node.js,Fils 說,很流行,“雖然我很喜歡它,但它的單執行緒事件迴圈機制和非阻塞的程式設計模式讓我不太滿意。還有,所有的東西都要用Javascript的回撥函式,我不喜歡這樣。”很顯然,他不是一個JavaScript的粉絲。Go語言的語法和結構,從另一方面講,“還是很簡潔的。”
當Go語言的語法和結構趨於穩定,併發布了Go 1時,他覺得應該轉回來,重寫他的Go語言程式。這回,他想起來了當初為什麼想用Go來開發。
優勢在哪裡?
部署簡單。Go 編譯生成的是一個靜態可執行檔案,除了 glibc 外沒有其他外部依賴。這讓部署變得異常方便:目標機器上只需要一個基礎的系統和必要的管理、監控工具,完全不需要操心應用所需的各種包、庫的依賴關係,大大減輕了維護的負擔。這和 Python 有著巨大的區別。由於歷史的原因,Python 的部署工具生態相當混亂【比如 setuptools, distutils, pip, buildout 的不同適用場合以及相容性問題】。官方 PyPI 源又經常出問題,需要搭建私有映象,而維護這個映象又要花費不少時間和精力。
併發性好。Goroutine 和 channel 使得編寫高併發的服務端軟體變得相當容易,很多情況下完全不需要考慮鎖機制以及由此帶來的各種問題。單個 Go 應用也能有效的利用多個 CPU 核,並行執行的效能好。這和 Python 也是天壤之比。多執行緒和多程式的服務端程式編寫起來並不簡單,而且由於全域性鎖 GIL 的原因,多執行緒的 Python 程式並不能有效利用多核,只能用多程式的方式部署;如果用標準庫裡的 multiprocessing 包又會對監控和管理造成不少的挑戰【我們用的 supervisor 管理程式,對 fork 支援不好】。部署 Python 應用的時候通常是每個 CPU 核部署一個應用,這會造成不少資源的浪費,比如假設某個 Python 應用啟動後需要佔用 100MB 記憶體,而伺服器有 32 個 CPU 核,那麼留一個核給系統、執行 31 個應用副本就要浪費 3GB 的記憶體資源。
良好的語言設計。從學術的角度講 Go 語言其實非常平庸,不支援許多高階的語言特性;但從工程的角度講,Go 的設計是非常優秀的:規範足夠簡單靈活,有其他語言基礎的程式設計師都能迅速上手。更重要的是 Go 自帶完善的工具鏈,大大提高了團隊協作的一致性。比如 gofmt 自動排版 Go 程式碼,很大程度上杜絕了不同人寫的程式碼排版風格不一致的問題。把編輯器配置成在編輯存檔的時候自動執行 gofmt,這樣在編寫程式碼的時候可以隨意擺放位置,存檔的時候自動變成正確排版的程式碼。此外還有 gofix, govet 等非常有用的工具。
執行效能好。雖然不如 C 和 Java,但通常比原生 Python 應用還是高一個數量級的,適合編寫一些瓶頸業務。記憶體佔用也非常省。
總結:
很多時候,一種語言的優點很可能是它的缺點,缺點又可能是它的優點。這主要看你是從哪方面去考慮。這就印證了那句話,凡事沒有必然。
不管是哪種語言,只要你採用他達到你想要的,那就成功了。無需過多在意它的缺點,更無需讚揚它的優點。
語言只是工具,沒有好壞之分。
本作品採用《CC 協議》,轉載必須註明作者和本文連結