1. 程式人生 > >Python:經過了十幾年,你們還沒有消除的對我的誤解嗎?

Python:經過了十幾年,你們還沒有消除的對我的誤解嗎?

Python 快速入門 基礎大全 爬蟲 web

摘要:

大學畢業到現在用的最多的編程語言還是C,C++,後來學習了一下Python,覺得Python是門學了不後悔的語言。尤其適合非程序員學習,作為青少年學習計算機的首門語言也不錯,大學生學習計算機采用Python語言作為入門也不錯。一個軟件工程師,感覺以C+Python+HTML5+JavaScript的搭配也可以接受。對於Python語言一直存在一些誤解,整理了一下網上資料,僅僅當作自己學習的樂趣,也算是給自己鼓鼓勁。

註:

這裏不想討論編程語言的優略,因為程序員都是認真的,一討論編程語言一定會熱鬧起來,比如以前Linux作者林納斯·托瓦茲的C與C++好壞爭論,...... ,PHP是世界上最好的語言等等。

練武功既要練招式,也要練內功,討論編程語言別太認真,選合適的解決自己問題的語言就好。

技術分享圖片

圖:Linux之父Linus Benedict Torvalds

技術分享圖片

Python是一門新的語言:

Python語言在國內大規模流行主要是從2014年左右開始,這一點從某娘的搜索指數也可以看出。

技術分享圖片

圖:幾種編程語言的搜索指數趨勢

由圖可見,2014年前,Python在國內搜索指數很低,2014年之後逐漸增加,到2017年竟然超過了老大Java。但不要認為Python新近流行,就認為Python是新語言,其實了解Python歷史的人一定知道,Python誕生於1989年,1991年發布第一個版本,其年齡比Java還大4歲。Python一個著名的早期使用的例子是1996年Google的第一個成功的網絡爬蟲。和Java比Python更像草根,一直默默修煉,最終大器晚成。這麽多人喜好說明Python還是有它自身的優點的。

Python是解釋型語言,沒有被編譯:

Python的確不像C、C++那樣需要編譯成可執行程序,但它更像Java,會將源代碼編譯成自己的字節碼。字節碼有解釋器(Java稱虛擬機)來處理執行。Python和Java比完全開源,沒有被某個大機構掌控,解釋器也比較多,如:CPython, PyPy, Jython/JVM, IronPython/CLR等等。

Python是腳本語言,不是一門獨立的開發語言:

Python確實是一種面向對象的腳本語言,而且還是這個領域的先行者之一。因其語法簡單,支持跨平臺,並且普遍存在於Linux,Macs和其它Unix機器中。尤其是在自動化運維方面,Python語言絕對是首選。目前自動化測試也開始更多的選擇Python語言。

但是不能因為其這方面強大,就忽視了Python最為一門獨立編程語言的特性,事實上,Python可能是通用編程語言中最靈活、功能最強大的開發語言之一。下面給出一些實例:

1.電話基礎設施(Twilio)

2.支付系統(PayPal,Balanced Payments)

3.神經科學和心理學(例子很多)

4.數值分析和工程學(numpy, numba和很多其它例子)

5.動畫片(LucasArts, Disney, Dreamworks)

6.遊戲後端(Eve Online, Second Life, Battlefield和很多其它例子)

7.電子郵件基礎設施(Mailman, Mailgun)

8.媒體存儲和處理(YouTube, Instagram, Dropbox)

9.運營和系統管理(Rackspace, OpenStack)

10.自然語言處理(NLTK)

11.機器學習和計算機視覺(scikit-learn, Orange, SimpleCV)

12.安全和滲透測試(DNSRecon、patator、XSSer、太多了,包括eBay/Paypal/)

13.大數據(Disco, Hadoop support)

14.日歷(Calendar Server, which powers Apple iCal)

15.搜索系統(ITA, Ultraseek, and Google)

16.互聯網基礎設施(DNS) (BIND 10)

17.雲計算平臺(OpenStack)

18.爬蟲框架(Scrapy,scrapy-redis)

19.WEB架構(Django、Flask、Tornado)

20.調試和逆向工程(很多這裏不列舉了)

其他例子舉不勝舉,可以通過互聯網搜索。 當下,以Python作為主開發語言是沒有任何問題的,可以作為初入行者的首門語言。

Python是弱類型語言:

Python一個明顯的特性是變量是動態類型的,這不影響Python作為一種強類型語言。從某種意義上講,Python具有比Java更強的類型系統。Java的原語和對象有各自的類型系統,Null存在於一種灰色地帶。

另一方面,Python有一個統一的強類型系統,None這種類型也有明確的定義。

關於Python的類型系統,在應用中也需要註意,認真處理,否則也會帶來麻煩。

Python不安全:

Python是解釋型語言,通常軟件發布采用源碼方式,所以認為代碼保密性不好,安全性不好。前面我說了,Python是支持編譯的,其實Python可以是編譯+解釋混合型。

另外安全不能依靠編譯狀態的代碼,更重要的是使運行環境更安全。因為本質上,每種語言都有反匯編器或可以被破解,這會破壞程序的保護狀態,所以安全不能僅僅靠編譯。

安全的一個核心原則是盡可能小的呈現目標。CPython通過簡單的、穩定的和易於審計的虛擬機來解決這些問題。事實上,在Coverity軟件最近的一個分析中,CPython得到了最高的質量評價。

Python還具有一系列廣泛開源的、行業標準的安全庫。將hashlib,PyCrypto和OpenSSL結合在一起,通過PyOpenSSL,進行一些處理是可以滿足各種安全和性能需求的。

根據公開資料,PayPal(eBay)的應用安全組中使用Python的安全應用的例子也不少:

1.為促進密鑰置換和加強加密的實現創建安全代理

2.集成行業領先的HSM技術

3.為不兼容的棧構建基於傳輸層安全的包裝器代理

4.為我們內部雙向認證機制產生密鑰和證書

5.開發主動的漏洞掃描器

國內的BATJ公司也大量使用Python進行開發,此外,很多由Python構建的以運營為導向的系統都暗含安全特性,例如防火墻和連接管理等。

Python缺乏好的並發性支持:

提到Python,一定會提到Python的GIL(全局解釋器鎖),也一定會質疑“Python缺乏並發性”。這個確實不好說。只能簡單來看吧。

Python有大量的並發性原語,包括generators,greenlets,Deferreds和futures。Python有非常多的並發性框架,包括eventlet,gevent,pulsar,toro,offset和Twisted。

目前已有大量的工作投入到了為並發性定制運行時間,包括Stackless和PyPy。所有這些,以及更多的案例表明有效地使用Python可以進行並發編程。這些企業級的產品都得到了官方支持和使用。

全局解釋器鎖GIL是在Python大多數使用情況下的性能優化,也是CPython 代碼在開發中的易用性優化。GIL可以讓操作系統的線程或綠色線程使用起來更容易,同時不影響多進程的使用。

目前大量服務器端軟件采用Python開發,我們也看到Python服務器每天每臺機器有數百萬次的請求,但它們都可以輕松的處理。所以不能說Python缺乏並發行支持。

Python不適合做大項目:

Python主要特點之一是開發效率極高,Python項目組能以少量開發人員完成較大項目。Instagram達到每天億萬次的點擊和數10億美元,整個公司仍然只有一組數十人的團隊。Dropbox在2011年僅有70名工程師,其它Python團隊的情況也很類似,人員不多。同時也帶來一個質疑,Python做不了大項目,組建不了打團隊。Instagram,Dropbox算小項目嗎?

我們看幾個例子,美國銀行實際上有超過5000名Python的開發人員,一個單獨的Python項目有超過千萬行Python代碼。摩根大通經歷了相似的轉變。YouTube也有數千名工程師和數百萬行代碼。大的產品和大的團隊每天都使用Python,它們具有卓越的模塊化和封裝特性,超過某一特定點後,通用開發規模基本保持不變。工具、強的約定和代碼評審使大的項目易於管理。

編寫大項目任何語言都會碰到問題,不能光靠語言約束。應該遵守合理、嚴格的規範,養成良好的編程素養。如:可以支持PEP8規範,在提交代碼前,我們使用PyFlakes和其它工具去執行Python代碼的靜態分析等等。

事實上Python不僅開發效率高,更容易開發出高效,穩定的軟件。

Python不能擴展:

這個有點沒模糊,Python語言本身是可擴展的,Python也可以開發出就有擴展性的軟件。YouTube采用Python開發,是一個可擴展的網站。每月都有超過10億的獨立訪客,每分鐘上傳超過100小時的視頻,占用20%的互聯網絡峰值帶寬,這些都用Python作為核心技術。Dropbox、Disqus、Eventbrite、RedTwilio、Instagram、Yelp、EVEOnline、Second Life、eBay、以及PayPal,這些案例證明Python的擴展性還不賴。

簡單性和一致性是成功的關鍵。CPython這個基本的Python虛擬機,使這些特征最大化,同時也使運行時間可以預測。很難看到Python程序員關註垃圾收集中止或應用程序啟動時間。隨著強大的平臺和網絡支持,Python自然地適應了智能的橫向可伸縮性,主要表現在像BitTorrent這樣的系統中。

另外兩個問題:

這兩個不能算是誤解,可以說是事實。

1、Python運行速度慢

Python作為解釋型語言,通常理解是沒有C、C++這些編譯型語言快。不過說Python語言比Java慢,這個有待商榷。可以從以下幾個方面看這個問題,語言僅僅是一個因素,單獨評估一個語言的快和慢,有時並不恰當。應該對一個應用程序,最好是針對一個特定的用例進行評估。比如用Java,Python同樣實現一個軟件進行評估。由於Python可以和C、C++很好的互相調用,對於真正需要性能的地方可以使用C、C++進行擴展,然後需要提高編碼效率的地方用Python實現,這樣寫出的整體軟件可能比Java還快。還有現在出現了一些優化的Python解釋器,如:PyPy的JIT編譯器達到了比C語言更快的性能。還有Python應用在服務器端居多,和運行速度比網絡吞吐量也是瓶頸,從現有軟件看,Python的運行速度不是最大問題,Disqus的用戶規模從2.5億增長到5億,一直都是使用同樣的100臺服務器。提高軟件的叠代速度也是要考慮的因素。Python從設計之初就把開發者的開發效率放第一位。根據經驗,同樣的時間內,Python項目比C++或Java項目會有更多叠代次數。

2、Python程序員稀缺

Python流行相對較晚,而且之前Python通常作為一個工程師的第二語言,Python開發工程師數量少是事實。

Python的網頁開發工程師不如PHP和Java那麽多。這可能是由於行業需求和教育的聯動導致的,但教育趨勢表明這很有可能會被改變。

Python開發的高效率,使得采用Python開發,一個較小的團隊可以完成一個高效,強大的軟件的開發工程。這也是一個因素。

從另外一個角度看,Python從業人員少也是相對的,Python從業人員的絕對數量也不少。全世界有數以百萬計的Python開發人員,幾十個Python會議,StackOveflow上幾萬個Python相關的問題,一些公司,如YouTube,美國銀行,和LucasArts/Dreamworks雇用了成千上萬的Python開發人員。

一個新建項目或者初創公司更喜好選擇Python,原因如下:

Python非常容易學習,而且對孩子,大學生和在職人員來說也是首選編程語言。對一個新Python程序員來說,只需要一周時間,他就能夠初見成效,往往在2到3個月就可以大放異彩,互聯網上豐富的互動式教程,書籍,文檔和開源的代碼庫,使這一些變得可能。

近年Python開發工程師崗位數量激增。從業人員薪水還算不錯,所以一定會有大量的初學者入場,平均薪資被拉低也是必然。從業有風險,入行需謹慎。

技術分享圖片

圖:Bruce Eckel原話是"Life is short, you need Python"


Python:經過了十幾年,你們還沒有消除的對我的誤解嗎?