圖片來源/CC By 4.0 by Wei Lee

「我們與惡的距離」,這是臺灣2019年最紅的一個關鍵字,Google搜尋每年都會列出,全球各地的關鍵字排行榜,來反應這一年人們最關注的話題。

開發圈也有一個流行度排行榜——TIOBE(全球開發語言排行榜),同樣整合了全球各大搜尋引擎對不同開發語言的搜尋熱度,估算出了每個開發語言每個月的熱門程度。Java語言和C語言,不斷輪流搶奪龍頭寶座,幾乎包辦了過去20年的冠亞軍。但是,有一匹黑馬,從2017年底竄出,拋開了緊追在後的Visual Basic、JavaScript或PHP,在2018年更快速地超越了C#、C++的流行程度,在2019年6月,擠進了前三甲,更有挑戰兩大龍頭的地位,這個開發語言的新主流,就是Python,也正是在AI應用大爆發的這兩年,最受資料科學家青睞的語言,甚至,Python被譽為是AI時代的主流語言(Lingua Franca)。

開發圈熱門問答網站Stack Overflow每年都會進行一次開發者大調查,2019年的調查結果發現,Python打敗了Java,成為工程師最喜歡的第二個語言,僅次於Rust。不只是偏愛,實際應用上,在常用語言排名中,Python名次也攀升到第四,僅次於JavaScript、HTML/CSS、SQL這些網站常見技術之後,但遠超過了其他開發語言。這意味著,越來越多人使用Python來開發程式,正在使用的開發者想要持續使用它,更有許多開發者想要學。

若觀察TIOBE近20年來的程式語言網路聲量趨勢,不難發現Python處於穩定上升的狀態,自2018年9月超過C++之後,更是持續與一眾語言拉開流行度差距,因快速成長的潛力,還一口氣拿過2007、2010、2018年的年度語言冠軍。

不只開發者偏愛,Python也是許多開發專案、軟體常用的技術。在全球最大開源專案平臺GitHub上,去年年度報告統計,Python首次超過Java,成為GitHub上第二流行的語言,僅次於JavaScript,這意味著使用Python的開發專案數量,是全球第二多。

為何這麼多開發專案愛用?GitHub報告直言,快速擴張的資料科學社群,就是Python竄紅的關鍵。隨著AI應用崛起,許多科學計算、數據分析的函式庫與套件紛紛出籠,而且都支援或直接使用Python語言來開發。

其實,Python語言快要30歲了,已經不年輕了!1989年,一名荷蘭工程師Guido Van Rossum在聖誕節閒暇之餘,決定為正在構思的一個新腳本語言寫一個直譯器,並從熱愛的電視喜劇(Monty Python's Flying Circus)中,取Python來為專案命名。由於Van Rossum曾參與ABC程式語言的開發,欣賞它簡潔優美的語法,因此,他也讓Python繼承了這項特色,打造出一個能替代Unix shell與C來進行系統管理的新語言。

Python的誕生,就是追求更好的程式碼可讀性,更簡潔的語法,這些語法簡潔、簡單易用的語言設計,更讓它在1991年開源之後,逐漸吸引了不少網站工程師愛用,逐漸成為熱門腳本語言之一,也經常與Perl、Shell Script混搭,用於Web伺服器的後端腳本程式開發上,來建立動態網頁應用。

不只是一種技術風格,Python語言的簡潔設計,後來更發展成一種程式開發的哲學。1999年,創造出Timesort混合排序演算法的工程師Tim Peters,列出了20條Python設計禪學(The Zen of Python),比如「優美優於醜陋,明瞭優於隱晦,簡單優於複雜,複雜優於凌亂……」等原則。這篇Python知名貢獻者的文章,後來更列入了Python官方建議準則中(Python Enhancement Proposals,PEP),作為程式碼撰寫原則,更成了後來許多工程師,開發Python程式時的習慣。

用更少的程式碼來表達想法,讓程式的結構更清晰明瞭,儼然成了Python開發圈特有的風氣和特質。

不只是一種好看好懂的語言而已,Python對C語言的高度支援,也是開發者愛用的另一大原因。開發者可以藉助Python的簡潔來加快開發過程,又容易以C作為底層架構來整合其他語言的模組,提高程式碼的執行速度,同時兼顧開發與執行的效率。這也讓Python贏得膠水語言(glue language)的稱號,來形容Python很適合用於串接到各式各樣的系統(例如資料庫),或在數據計算時,用來連接其他語言編寫的函式庫等,用途相當廣。

經過多年的發展後,Python的主要定位,是在專業嚴謹與實用性之間作出平衡,以膠水語言的身份,將各種不同技術串接成完整系統。這個特色,逐漸讓Python在眾多領域中嶄露頭角,甚至已經在今日橫向擴展成一個龐大的生態系,不但在專業資安領域,被公認為網路攻防應用的首選,在雲端運算資源管理、IoT管理、Web開發、DevOps領域,也成為主流語言之一,近幾年來,在資料科學領域的崛起,更奠定了AI開發第一語言的地位。

Python TIOBE流行趨勢線

 2006年  微軟.NET開始支援Python,帶動一波熱潮,Python甚至成為TIOBE 2007年度語言,流行度超越Perl和C#。

 2008年  Python 2.7改版Python 3,因與Python 2不完全相容,引起不少社群反彈聲浪。

 2014年  Jupyter組織釋出了一款Web版程式開發工具Jupyter Notebook,成了Python在AI領域普及的關鍵。

 2017年  Python從2017年底流行度開始攀升,在2018年大幅超越了C#、C++的流行程度。

 2019年6月  全球流行度擠進前三名,緊追在C與Java之後。

AI如何助攻Python大受歡迎

要了解Python在AI領域為何盛行?首先,可以從資料科學家寫程式的目的來分析。由於大多資料科學家在開發演算法時,程式語言相對只是一種達成目的的工具,更重要的是演算法本身的設計與驗證。因此,一個能快速上手的程式語言,以及能降低程式語言設計門檻的開發環境,就顯得非常重要。

而Python的一大優點,就是具備了高階程式語言簡潔易讀、易學的特色,常被視為好上手的入門程式語言之一,符合了易於使用的需求;同時,Python擁有完整且多元的函式庫與框架,背後則有龐大社群在貢獻程式碼、維運工具與套件,讓開發人員可以無後顧之憂的套用所需功能的程式,不需從頭開始開發,能更專注於演算法的設計。

長期浸淫在Python科學計算領域近20年的交大AI學院副教授魏澤人,就根據自己使用Python的經驗分享,「Python的套件管理庫,各式各樣的功能都有」,開發者不用擔心開發專案時,得從頭開始打造某一個功能,「基本上都已經有人寫好了,只要透過pip工具直接安裝即可,非常方便。」他強調。

魏澤人更點出資料科學家愛用這項語言的另一個關鍵。他解釋,資料科學家開發演算法時,多半是實驗性、探索式的嘗試,與建置網站這種目的式的開發需求截然不同,而直譯式語言的Python,能讓開發者在修改程式後,一步步執行每一段程式碼,來了解其功能,「開發者與程式的互動性更高,比起編譯式語言更適合實驗及探索。」

再加上,Python像膠水語言般的特性,能輕鬆地將其他程式語言編寫的各種模組整合在一起,更吸引到其他非資料科學領域開發者的喜愛。對講究實用的企業而言,資料科學家開發出一個新的演算法後,要實際落地應用到業務場景時,Python就能成為資料團隊與其他部門工程師協同合作的共同語言。

比如國泰世華銀行數據生態營運部協理吳香妮就指出,原先資料科學團隊較常用R、SAS來開發應用,現在則主推Python,其中原因,就是要讓專注於演算法開發的資料科學家,能與API開發的工程師共同協作。

對此,魏澤人也有相同的觀點。學術界從1990年代起,研究數值分析、機器學習演算法時,最主流的軟體是需付費購買授權的Matlab。但從整個資料科學界來說,他認為,開源的Python,能通用於其他程式設計領域,如Web開發、網路爬蟲或寫個小工具等,「就結果論來說,Python才是數值計算與程式設計族群,都能接受的程式語言。」

先從數學和科學計算領域開始流行

Python在2000年開始,就是數學、物理、科學計算的工具之一,當時,魏澤人也用來執行數學計算的任務,「Python有一些程式語言的特性,相當適合數學計算。」比如說,Python的list comprehension語法,類似數學集合的寫法,可讓使用者以更簡單直覺的方式來建構列表(list),所以受數學背景的人喜愛,在整數計算上面,因為Python內建的整數沒有大小的上限,也適合用來解數論、組合、離散這類常會碰到大整數的數學問題。

在2000年之後,Python科學計算領域中,開始出現了Scipy開源函式庫,提供更完整的數值計算、矩陣計算等功能,2001年也舉辦了第一屆Scipy年會,讓開發者能互相交流以Python編寫的最新科學專案,而後,更多函式庫如Matplotlib、Numpy、Pandas開源釋出,也吸引科學計算社群逐漸擴大。

2014年,致力於推動程式語言開放標準Jupyter組織釋出了一款Web版程式開發工具Jupyter Notebook,更成了Python在AI領域普及的關鍵。這個介於複雜的整合式開發工具IDE和程式碼文字編輯器之間的工具,可以快速將演算法程式,套用到數據資料上來繪製各類圖表,大幅降低了Python的使用門檻,因而深受資料科學家的喜愛。

臺灣極少數成為Python軟體包官方機構(The Python Packaging Authority)活躍貢獻者的鍾子屏這麼形容:「Jupyter Notebook之於ML,就類似Excel之於會計一樣。」就像Excel可以自動、快速執行各種會計計算,將計算結果視覺化,而Jupyter Notebook就是一個讓資料科學家開發、執行程式碼的互動式開發環境,能將資料視覺化來輔助開發。

有趣的是,雖然Jupyter Notebook並非Python的專屬開發工具,目前支援多種主流直譯式語言如Python、R、Julia,但它的前身是IPython Notebook,是一款基於Python提供互動運算命令介面的記事本,本來就是支援Python為主,後來多支援了Julia與R語言,才改名為Ju-pyt-er Notebook。因此,這款工具對於Python的極高支援性,成為資料科學家選用Python的重要理由。

Python資料科學領域逐漸豐富的開源函式庫、框架、IDE、套件工具,大幅提升AI開發的便利性,吸引更多人、甚至大企業都用來開發AI應用。而大企業加入後,不僅更多產品、服務開始支援Python,各類套件工具也推陳出新。

比如Google 2015年開源的ML框架TensorFlow有支援Python,臉書在2016年也開源以Python開發的ML框架Pytorch,幾乎成為成長速度最快的兩種ML框架。再加上,專門為Python設計的開發環境Pycharm,以及CPython、Jython、Pypy、IronPython等直譯器,這些套件與工具,都不同程度的助攻Python成為AI時代的流行語言。

不只AI,Python早就在Web應用大展身手

儘管近幾年,隨著資料科學爆紅,更帶動了Python的人氣,但對Web領域而言,Python早就是一個廣泛好用的熱門技術。比如IDE廠商JetBrains在2018年開發者報告就指出,Python社群中,58%的開發者曾用Python來開發資料分析應用,但也有52%的人用來開發Web應用。這意味著,儘管不少資料科學家壯大了Python社群,但社群本身在其他領域應用Python的基數,也不容小覷。

早從1990年代開始,Python常用於網頁後端的腳本開發上,不過,當時最流行的腳本語言還是Perl、Shell Script等,Python頂多排第三,獲得部分開發者的支持。2000年後,開始出現了以Python開發的Web應用伺服器Zope,以及建立於Zope之上的開源內容管理系統Plone,受到部分Web開發者的青睞。不過,當時主流的Web開發語言像是Java、PHP、C#,各種語言均有人青睞,Python並沒有絕對的優勢。

而後,Python今日最熱門的兩種Web應用框架,Django與Flask,分別在2005、2010年釋出,逐漸將Python也推上網頁後端與Web應用開發領域的常用語言,尤其,Django能讓開發者快速建立起高可用性的後臺,而Flask適合用於輕量級的網站,也適合用來開發API。

Python也不只能用於簡單用途或小型任務,也有許多超大型的應用實例,像Google搜遍所有網站內容的網路爬蟲,就是用Python開發的程式。Dropbox也用Python開發了超過400萬行程式碼,就連Instagram數十億用戶的互動環境,也靠Python與Django框架來打造。

雖然目前在TIOBE開發語言排行榜上,Java和 C分居前兩名,Python靠AI崛起才後來居上,名列第三,不過,Python的發展還沒到頂,未來的成長潛力與空間,還有機會能更進一步。

Python的兩大難題

Python的兩大難題,就是最佳化與平行處理的能力。

以Python而言,作為一個高階語言,語法簡潔、程式碼可讀性高為一大優點,適合程式設計初學者入門學習;但反過來說,已經熟悉了其他語言的開發者,比如語法嚴謹的C或Java,要轉換成Python可能有些適應不良,Python的強制縮排語法特色,也可能讓開發者很不習慣。

Python作為直譯式語言,儘管因互動性高、除錯快等優點,能讓開發者更彈性且快速的進行探索式的開發,比如近年來資料科學領域盛行的R、Metlab等語言,就同屬這類。不過,也因需要一步步直譯程式碼,先天上就會比編譯式語言花上更多的執行時間,影響程式的執行速度變慢。

而且,Python同時也是一個動態語言,開發者不需先宣告變數的型態,回傳型態也不需宣告,能讓語法更簡潔、彈性,不過,這也造成難以除錯的問題,型態錯誤可能在執行程式時才會呈現出來,影響程式執行效能不理想。魏澤人舉例,當一個變數寫成number=3,若不小心打錯成nmber=3時,在靜態語言中,會因與宣告的型態不同而自動警告,但在動態語言中,它可能認定為,有一個新的變數叫做nmber,並不視為一個錯誤。也就是說,由於動態語言的彈性較大,對編譯器來說,也較難最佳化。

另外,Python還有全域性直譯器鎖GIL 的限制,難以讓一個Python程式在多核心的處理器上進行平行處理。魏澤人解釋,由於平行處理能增加執行效率,程式常被拆分到不同執行緒來執行,不過,Python為了避免多執行緒記憶體及資源讀寫次序不一致的問題,就內建了一個GIL,來限制每次只有一個執行緒能執行資源存取。

也就是說,GIL本意是要解決執行緒間資料同步合作的困難,卻也因此侷限了平行處理的效能。但這個問題並非無解,常用的解決方法,可用multiprocessing取代threading,讓每個程序有獨立的記憶體,再例外由通訊交換資料,或建立特定共用記憶體;另一種方式是利用外部資料科學的函式庫如Numpy、TensorFlow,來處理需要大量計算的部分。

總結來說,Python身為一個直譯式的動態語言,加上GIL的設定,最佳化、平行處理能力較差,影響了程式執行效率。不過,藉著發揮膠水語言的優勢,Python也能與其他如C、Java等編譯式語言結合,來加速運算執行。

 相關報導  AI時代開發語言新主流Python


Advertisement

更多 iThome相關內容