1. 程式人生 > >Python不能用於大型項目?人們對Python的十大誤解

Python不能用於大型項目?人們對Python的十大誤解

Python 項目 程序員 編程學習

Python 類型系統的特點是擁有強大、靈活的類型操作. 維基百科上對此作出的闡述.

而存在一個不爭而有趣的事實是, Python 是比Java更加強類型的. Java 對於原生類型和對象區分了類型系統,它讓null存在於一個灰色地帶. 另一方面,現代的 Python 擁有一個統一的強類型系統, 其中什麽都沒有(None) 的類型是明確指定的. 更進一步的,JVM自身也是動態類型的,因為可以把它的 根源 追溯到由Sun所收購的Smalltalk VM的一個實現.

Python的類型系統 很棒,但要提供給企業級使用,目前仍然還有許多更重大的事項需要關註.

歡迎加入群:725479218,技術分享,學習交流,資料共享

謬誤 #6: Python 速度慢

首先是有一個重要區別: Python 是一門編程語言,而不是運行時環境. Python 擁有幾個實現:

  • CPython是參考實現, 且也是廣泛發布和使用的實現.
  • Jython是Python用於JVM的是一個成熟的實現.
  • IronPython是 Microsoft 針對其自家的通用語言運行時——又名 .NET,實現的Python .
  • PyPy是一個正在日趨成熟的Python實現,擁有JIT編譯,增量垃圾收集諸多先進的特性.
    每一個運行時都有其自己的性能特點, 而且他們本身也不慢. 這裏更重要的地方在於不能錯誤地把一個性能指標分派到一門編程語言智商. 應該總是把該評估用在一個應用程序運行時上面,最好是針對一個特定的使用場景.

    清楚了那些事項之後,下面就是一些有Python提供的小項,體現其重要的性能優勢:

  • 把 NumPy 用作 Intel 的 MKL SIMD接口
  • PyPy的 JIT 編譯能 達到比C還快的性能
  • Disqus 能在同樣的100個盒子上容納兩億五千萬到5億用戶

誠然,這些都不是最新的列子,只是我個人的最愛罷了. 這將很容易扯到高性能Python以及獨立提供的運行時這些廣闊的領域. 我們不應只是專註於解決單個特殊的案例, 而是應該把註意力放在對開發人員在 最終產品性能 方面的生產力的普遍影響上面, 特別是在一種企業級環境之下.

技術分享圖片

C++ vs Python,. 兩種語言在同一個輸出下的對比.

給定足夠的時間,一個循規蹈矩的開發者只會按照下面這種經過論證的方式來編寫精確高效的軟件:

  • 設計實現一個可以正確完成任務的軟件,包括開發單獨的測試
  • 測試性能,明確瓶頸
  • 優化,根據測試和Amdahl法則,並且利用Python與C的淵源
    雖然這聽起來很簡單,但是即使是老道的工程師,這依舊是一個非常耗時的過程。Python設計之初就考慮到了這一套開發流程。根據我們的經驗,通常C++和Java項目完成一次叠代流程的時間,夠Python項目完成三次叠代流程。今天,PayPal和eBay中不乏有Python項目使用更少的代碼戰勝了同類C++和Java項目,這多虧了快速的開發使得仔細的裁剪和優化變得可能。

    Myth #7: Python無法做到大規模

大規模有許多定義,但無論怎樣,YouTube是個大規模網站。每月UV超過十億,每分鐘上傳的視頻時長超過100小時,占用互聯網帶寬的20%,所有這一切都以Python作為核心技術。Dropbox,Disqus, Eventbrite, Reddit, Twilio, Instagram, Yelp, EVE Online, Second Life,,以及,是的,以及eBay和PayPal中都有Python大規模的例子,這些證明大規模不僅僅是可能:它是一種模式。

成功的關是鍵簡單性且一致性。CPython,Python的主要虛擬機,其最大限度地放大了這些特性,從而演變出了一個精確可測的運行時。人們很難發現 Python程序員關心垃圾的收集暫停或應用地啟動時間。擁有強大的平臺和網絡支持,Python其本身自然而然的智能水平可擴展,BitTorrent就是其充分的體現。

此外,規模化主要涵蓋測量和叠代。Python是以分析和優化為要義建立的。看Myth #6了解更多Python如何垂直拓展的細節。

Myth #8: Python缺少好的並發支持

除了偶爾叫囂性能和規模化的問題,有人想提的技術些,”Python缺乏並發,”或者,”GIL怎麽樣?”如果幾十個反例仍不足以支持Python水平及垂直拓展規模的能力,那麽再更深地解釋CPython實現細節也不會有幫助,所以我會簡短些。

Python擁有強大的並發原語,包括generators, greenlets, Deferreds, 和futures.。Python有優秀的並發框架,包括eventlet, gevent,和Twisted。Python在定制運行時尚投入了驚人的工作量,包括Stackless和 PyPy。所有煩人這些和更多表明,根本不存工程師們在Python並發編程方面的缺憾。同時,所有這些都正在被正式的在企業生產環境中支持或使用。例如,請參考Myth #7。

全局解釋器鎖,或稱GIL,是Python在大多數應用場景下的性能優化,也是幾乎所有CPython實現代碼的開發上的基礎優化。GIL使得Python可以很便利地使用操作系統的線程或輕線程(通常指greenlets),且不影響使用多進程。更多相關信息,請看該主題的Q&A列表,以及Python文檔中的介紹。

在PayPal中,一個典型服務的部署需要多臺機器,多個進程,多個線程,以及一個數字非常龐大的greenlets,相當於一個非常強大可擴展的並行環境(見下圖)。在大多數的企業環境中,團隊更傾向於往更高層次過度,謹慎並註重災難恢復。然而,在某些情況下,每臺機器每天Python服務仍然處理數以百萬計的請求,而且輕松處理。

技術分享圖片
一個基於單一worker的協同異步架構草圖。最外層的盒子是進程,下一個層次為線程,這裏這些線程都是輕線程。操作系統處理線程間的搶占,而I/O異步協同合作。

謬誤 #9: Python 程序員很稀缺

事實上,現在使用 Python 的 web 開發者的確沒有使用 PHP 或者 Java 的 web 開發者多。這可能主要是由於企業需求和教育之間的相互作用導致的,不過 教育領域(教學所使用的編程語言)的趨勢使得情況可能產生變化 。

也就是說,使用 Python 的開發者並不稀缺。現在全世界有數百萬使用 Python 的開發者。已有幾十個Python 技術大會、 StackOverflow 上成千上萬的 Python 內容問答、雇傭大量使用 Python 的開發者的大企業比如 YouTube 、 美國銀行( Bank of American )和 LucasArts/Dreamworks 等等,這些都顯而易見地證實了這一點。在 eBay 和 PayPal 我們一直保持擁有幾百位使用 Python 的正式開發者,這是怎麽做到的呢?

那麽,當一個項目被創建時為什麽它會被首推?對於孩子來,大學生和教授們來說,Python作為第一門程序設計語言是非常易於學習的。在eBay,僅僅需要一個星期,一個新的Python程序員就能展示一個真正的成果,並且他們開始散發光芒常常只要2-3個月,通過Internet的寶藏(互動式教程,書,文檔和開源代碼庫)一切皆有可能。

另外一個重要的考慮因素是,項目使用Python會更簡單,它不會像其他項目那樣需要那麽多的開發者。在謬誤6和謬誤9中提到的那樣,在Python項目中,學習像Instagram那樣的高效團隊是一個常見的比喻,並且這確實是我們在eBay和PayPal的經驗。

Myth #10: Python不適應於大項目

Myth #7 討論了大規模運行Python的項目,但開發Python大規模項目是什麽情況呢?正如在Myth #9中提到的,大多數Python不被人看好。 然而Instagram在其被億元美金收購當天達到千萬的點擊量,而整個公司只有十幾個人。Dropbox在2011年只有70個工程師,其他團隊更少。所以,Python適合大規模團隊嗎?

美國銀行實際上有超過5000的Python開發者,一個單獨的項目超過一千萬行Python代碼。JP摩根也經歷了類似的轉變。YouTube也有數千的開發者和數百萬行的代碼。大規模產品和團隊每天都在使用Python,因為它具有良好的模塊化和封裝特性,在特定方面許多的大規模開發建議是一致的。工具,強大的慣例以及代碼審查促使了項目規模化管理的現實。

幸運的是,Python發展於上面所提到的好的奠基。我們在檢查執行使用pyflakes以及其他工具進行Python代碼的靜態分析,正如堅持PEP8——Python語言的基礎風格指南。

最後,應該指出的是,除了調度加速Myth #6以及#7中所提到的,使用Python的項目通常需要更少的開發者。我們常見的成功案例中,使用Java或C++的項目通常有3-5開發者耗時2-6個月,最終由單一的開發者在2-6周(或小時,因為這些原因)完成項目。

有點像奇跡,但卻是現代發展的事實,但其往往出自一個競爭激烈的行業。

##一種幹凈的狀態
這些謬誤可能只是消遣。討論這些謬誤仍然很活躍的和受啟發的,包括內部和外部, 因為隱含在每一個謬誤裏的都是一個Python的優勢的認識。 而且, 記住這些看似乏味的表現和麻煩的問題是穩步成長的表露, 並穩定地增長興趣促進教育和持續地工作。 在這裏,希望能撲滅一場充滿火焰的戰爭,並且使得能真正去談論工作與Python的實現。

python學習交流群:725479218

Python不能用於大型項目?人們對Python的十大誤解