掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
最近我寫了一篇關(guān)于我為什么不擔(dān)心Python流失用戶的文章。幾分鐘之后有人問我Python的用法(usage),而這篇文章沒有提及,但卻是一個讓人深思的問題。我們看到,使用Python的用戶很可能在未來保持高位,但是Python是否會被用到盡可能多的項目中是不能保證的;用戶(users)數(shù)目很多而且穩(wěn)定,但是項目中Python的用處(use)并不確定。

這篇文章的用意是幫助表明Python仍然對大多數(shù)軟件項目是切實可行的。我不擔(dān)心把Python推銷給反對其他動態(tài)語言(如Ruby)的人,因為我認(rèn)為這些爭論與個人喜好有關(guān)。這篇文章是講給那些推銷靜態(tài)類型語言的人。具體上,這篇文章是針對Go的,但也可以是其他任何靜態(tài)類型語言。
“為什么Go?”,你可能會問。因為Go實際上在獲取Python的用戶。當(dāng)2003到2005年間Python的增長曲線是個曲棍球棒時,Python還不是被推下山巔的王者,而是個弱者。傳統(tǒng)上,Python從Java之類的語言陣營中獲得用戶,并且留住了他們(我不想談C++用戶,因為通常他們有嚴(yán)格的性能需求,需要一個系統(tǒng)語言,或者是性能成癮者,并且需要好好恢復(fù))。但是Go的情況不太一樣。如今Python是使用最多的語言之一,而不再是弱者了。一旦在靜態(tài)類型語言社區(qū)中出現(xiàn)一門語言,它的生產(chǎn)效率/性能的取舍相當(dāng)好,那便足以說服一些Python的程序員選擇Go而不再是Python了。
如今的Go
首先我應(yīng)該說,Go是目前我第二喜歡的語言。如果今天我要啟動一個項目,但不能說服人們使用Python,那我會提議使用Go。不要誤解我在本文中說Go是門不好的語言。這篇文章的要點是說服其他人,Python是生產(chǎn)率/性能取舍游戲中Go之外切實可行的替代方案,而不是表達(dá)Go是門不好的語言。認(rèn)為這篇文章是反Go的,那就是你的個人想法,而且不應(yīng)該這樣認(rèn)為。
我應(yīng)該說,我偶爾在工作中使用Go,并有點想關(guān)注這門語言的社區(qū)。既然我不能僅憑想象就成為Go專家,但這番話并不是僅從文檔或者博客中提取出來的。但是由于我是Python開發(fā)團(tuán)隊的一份子,無論我如何試圖表現(xiàn)得公平,固有的偏見某種程度上還是有的。
那么,帶著這些警告,我們來看下Go提供給開發(fā)者什么。
生產(chǎn)率
我看待Go的方式是,使用你最喜歡的編程語言,移除那些難于加速生產(chǎn)率的特性,就是Go。靜態(tài)類型的影響被降到最小,因為通常只有在API邊界時你才會面對它。結(jié)構(gòu)類型同樣使事情變得簡單(把它認(rèn)為是鴨子類型)。語法并不笨拙(雖然它使用了花括號)。不要認(rèn)為Go是C/C++去掉不安全的特性,加上生產(chǎn)率更高的東西,不然你會很失望(比如,“為什么我不能使用make()內(nèi)置函數(shù),也不能像map類型一樣對返回值進(jìn)行計數(shù)”,這種看待Go的方式是錯誤的;這就是為什么C++開發(fā)者沒有轉(zhuǎn)到Go的原因)。快速編譯也使開發(fā)周期更像一個動態(tài)語言,而不是一個需要編譯的語言。而且事實上有些人喜歡沒有異常機(jī)制帶來的冗長,因為這促使你處理每種異常情形而不是(意外地)忽略它們(這是貫穿Go初始系統(tǒng)語言設(shè)計的實例)。還有,這門語言本身相當(dāng)短小易記,并有嚴(yán)格的前向兼容性要求(forward-compatibility requirements)(你不可能更快地獲得泛型),大體上使用Go來編碼是件很愉快的事情。
由于是靜態(tài)類型,Go可以很容易地獲得工具支持(它對之前以此為設(shè)計目標(biāo)的語言也有幫助)。Go確保核心工具跟隨Go本身提供,也是明智之舉。go fmt強(qiáng)制執(zhí)行Go風(fēng)格的規(guī)則,并允許通過用戶自定義的規(guī)則來重構(gòu)代碼(“采用制表符縮進(jìn)”不再是問題,因為這意味著你可以隨心所欲地設(shè)置編輯器來代表制表符,然后go fmt將其轉(zhuǎn)換為普通制表符以適用VCS)。go fix會更新代碼以跟***發(fā)布的版本保持一致。go get獲取依賴并安裝。
Go***一個生產(chǎn)率功能是它靜態(tài)編譯所有東西,使部署更簡單。如果你使用容器來開發(fā)和部署,這也不算什么。只有當(dāng)你發(fā)布單個文件的命令行工具,而不是一組依賴和你自己的代碼時,這才算得上事。
性能
就性能來說,Go做的很好。很難指出任何基準(zhǔn)能準(zhǔn)確的證明Go總是最快的選擇,甚至計算機(jī)語言基準(zhǔn)游戲中一些基準(zhǔn)證明CPython 3是最快的。但是通常情況下可以認(rèn)為對于你的任何工作來說Go已經(jīng)足夠快了。
Go真正出色的地方是并發(fā)性(concurrency) 。要注意并發(fā)代碼并不是通常誤解的并行(parallelized)代碼; 并發(fā)代碼仍然可以是單線程的,僅僅在任務(wù)切換方面更加簡單/出色。Go通過使用goroutine使連續(xù)并發(fā)的代碼執(zhí)行起來絕對的簡單。如果你不想使用共享內(nèi)存的方式(雖然也同樣支持),該語言提供的通信管道允許以非常簡潔的消息傳遞方式進(jìn)行并發(fā)編程。將所有特征整合進(jìn)此語言中成為盡可能使用該語言開發(fā)并發(fā)代碼的又一原因。換句話說,Go程序運行很快,該語言盡力使你在合理的方式上獲得該效果。
如今的Python
如果順利的話我已經(jīng)讓你相信Go是一種優(yōu)秀的編程語言,除非因為其他原因,一些人不會認(rèn)為我在整篇文章對Go的描述很糟糕?,F(xiàn)在我們討論一下Python的生產(chǎn)率/性能是怎么樣的。
生產(chǎn)率
首先也是最重要的,Python非常容易學(xué)習(xí)。這也是為什么在當(dāng)前高評價的美國大學(xué)中將Python作為***的教學(xué)語言 。這相當(dāng)于該語言擁有成熟穩(wěn)定的新程序員的來源以及更容易培訓(xùn)其他程序員。 我想,要說服別人只用幾行Python代碼就會完成很多工作這并不難(Go/Python 3比較 顯示Python每次都比Go使用更少的代碼完成相同的工作)。所以我會堅持認(rèn)為使用Python會更高產(chǎn),即使和Go相比,這不會有人反對。
通常大家反對Python的地方是在工具支持方面。但是如果你注意到我指出的Go相關(guān)的支持工具,fmt, fix, 和 get, Python社區(qū)也有對等的工具。對遵循PEP 8的風(fēng)格格式化(style formating), 可以在提交檢查時使用pep8,或者如果想要更多go fmt風(fēng)格的自動重寫可以使用autopep8。對用于重構(gòu)的go fix或go fmt,你可以說2to3也可以完成同樣的功能。對于go get, Python有pip。我們有venv/virtualenv或cx_Freeze這樣的代碼凍結(jié)工具(跟其他一樣,位于容器之上?on top of containerization like anything else),而不是靜態(tài)編譯的二進(jìn)制包。甚至有貫穿項目的代碼分析工具如pylint。說Python因為缺少工具支持而不能用于大型項目,這種觀點對我來說是很膚淺的。
如果說有哪方面Python完全做的好,那就一定是它豐富的第三方擴(kuò)展庫和相應(yīng)的工具可供使用,就像在PyPI上面看到的那樣(我相信肯定有人忍不住要爭論說,“并不是所有的第三方庫都能夠在Python3上面運行啊”,事實確實如此,然而,這些第三方擴(kuò)展庫對Python3的支持已經(jīng)相當(dāng)好了,而且還在繼續(xù)改善中,所以我不會太在意這個爭論,另外,你可以同時使用Python2/3兩個版本進(jìn)行編碼,不需要關(guān)心針對哪個版本)??匆幌耮odoc.org,上面顯示Go也并不缺少社區(qū)支持,Pytho之所以能夠擁有更多可用的第三方庫僅僅是因為它的年齡,這個狀態(tài)也會繼續(xù)持續(xù)。
性能
因為Python已經(jīng)存在很久,且變得如此龐大, 簡單地去說 “Python是足夠快的” 不能說明整個的情況, 那是因為有各種各樣的實現(xiàn)加速的方式。但是在深入到VM級別的選項之后,意味著Python的stdlib提供了獲得加速的選項。舉例來說, concurrent.futures 是尷尬地執(zhí)行并行代碼的方式,這種方式是極其簡單的。而在Python 3.3中,新的asyncio編寫了異步代碼。它沒有像Go那樣被集成進(jìn)語言,在Python中的并發(fā)程序設(shè)計是可行的,且在方式上也未必是那么痛苦的。
但是***的辦法是,你可以在選擇的VM里改變Python代碼的性能。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流