「轉」曾經力壓java和c的Python現狀如何?

轉自CSDN博客

轉眼間,2018 年已進入倒計時階段,回憶起這一年中編程語言界的發展,過得風生水起的語言非 Python 莫屬。而它的火熱和人工智能產業的爆發不無關係,但全局來看,得益於 AI 的 Python 並非止於 AI,Python 還在系統編程、多媒體應用、數據庫編程、Web、爬蟲等多個場景中均有應用。不僅如此,這一年的 Python 在 TIOBE 編程語言排行榜中,兩度超越了 C++,湧進排行榜的前三甲。

但當前的 Python 是否真的如此完美?

「轉」曾經力壓java和c的Python現狀如何?

我剛剛從本月早些時候在 PyCon Canada 上演講的興奮中平靜下來。在會議上我見到了許多聰明的人,似乎每個人都在談論著同樣的痛點和希望。在這篇文章中,我將總結當前最為流行的編程語言 Python 的趨勢,以及所面臨的現狀。

我喜歡 Python,且在個人項目和專業項目上使用 Python 也將近 10 年了。我的工作一半是數據分析,另一半是快速原型創建,所以 Python 是個絕佳的工具。Python 本身最大的優點就是它有大量的庫,可以用來幹任何事情:機器學習、數據探索、可復現的研究、可視化、雲功能、Web API、以及其他所有你能想到的東西。

我離不開 Python 的原因之一就是 Python 的社區非常好,在 StackOverflow 和 GitHub 上與他人交流是一件非常愉快的事情。2015 年,我的一個朋友在我們學校組織 PyCon Canada,拉著我去做志願者。我發現社區非常友好,也非常有創造力。今年,我覺得我應該做一些回饋,在我的家鄉多倫多舉行的 PyCon 上做一次演講。短短三年內社區成長了很多,我對此感到十分震驚。

和以前一樣,我發現社區裡到處都是聰明又富有創造力的人。一個例子就是在這次演講中,有一位嘉賓分享了:用 Python 發現哈利波特中的性別偏差”,不管你覺得這個題目如何,但確實是個非常抓人眼球又非常好笑的題目。

但是,像任何工程一樣,Python 依然在建設中。我們對於 Python 語言的感受甚至不同於五年前,因此當時一些看似不熟悉的事情,今天不僅成為了可能,甚至成為了理所當然。這篇文章將闡述一些 Python 的發展方向,以及我對於它們成長的看法。

1,優點

2018 年的 Python 世界中出現了許多新東西,一些甚至度過了成長的煩惱期。下面是我個人喜愛的一些:

JupyterLab

Jupyter Notebook 是一個可以執行 Python(及其他語言)的 Web 應用程序,並能立即以嵌入的方式查看執行結果,包括圖表、格式化後的表格以及 Markdown 各式的文字等。它還會自動保存中間結果(像 REPL 一樣),可以導出成多種格式,還有上百種其他功能。

Jupyter Notebook 在社區中被廣泛使用,特別是在研究和科學領域。Jupyter 團隊毫無爭議地贏得了 2017 年的 ACM 軟件系統獎。

JupyterLab 是在傳統 Jupyter notebook 上進行了改進。它包含一些非常好的功能,如單元格拖拽、嵌入式查看數據文件(如 CSV)、標籤頁式的環境,以及一個以命令為中心的界面。當然它仍然在 beta 階段,還有一些小問題,如 Revea.js 幻燈片導出功能,單元格摺疊功能等都不能正常使用。但整體來說,它表明一個好的工具會不斷成長並進步,以滿足用戶的複雜需求。

pipfile 和 pipenv

pipfile 讓我感到非常激動!pipfile 是 PEP508 的一個實現,它的動機是用依賴管理系統替換 requirements.txt。

最原始的動機就是,使用 pip 進行的依賴管理與其他 Rust、Javascript 等語言中類似的系統比起來太落後了。雖然 pip / requirements.txt 的缺點眾所周知的,但我見過總結得最全面的就是這篇文章(https://www.kennethreitz.org/essays/a-better-pip-workflow)。我建議閱讀一下全文,不過大致內容如下:

requirements.txt 沒有標準:它應該列出所有直接和間接的依賴,或者只是直接的依賴?是否應該包括固定的版本號?另外,開發時所需的依賴也非常依賴個人喜好。不同的開發團隊會使用不同的規則,會讓構建的重現成問題。

為了保證依賴列表最新,就要在 pip install $package 之後立即執行 pip freeze > requirements.txt,這個流程非常難用,而且有許多問題。

依賴管理系統包含三個工具和標準(virtualenv,pip和requirements.txt),它們之間並沒有明確的互操作性。它們的存在都是為了完成單一的任務,那麼為什麼沒有單一的工具來做這件事呢?

使用 pipenv 吧。

pipenv 會自動創建 virtualenv,安裝並管理該 virtualenv 下的所有依賴,並自動保持 pipfile 最新。

儘管這個想法很好,但使用起來很麻煩。我在實際使用中遇到了許多問題,經常得回到前一種方式,比如顯式地使用 virtualenv。我還發現 locking 操作非常慢(部分源自 setup.py 的標準,也是工具鏈生態標準中的許多問題之一)。

2,缺點

像許多與 Python 一樣老的項目一樣(Python 都和我一樣老了),一些模塊和思想也上了年紀。這不是吐槽大會,我只是想說 Python 的社區可以做得更好。

tox

Tox 依然是 Python 世界中最好的測試執行器,而且它也非常糟糕。不僅是因為 tox.ini 的語法很不直觀,工具本身也非常慢。當然這並不是 tox 自己的錯誤,而是整個 setup.py 系統就有設計缺陷。因為這些文件定義了包之間的依賴,而它們執行代碼查找依賴繼承關係就非常慢。這導致一系列工具都很慢。我相信 2019 年我們的社區應該嘗試解決這個問題。

此外,它依然不支持 pipfile,讓它變得更慢。像許多東西一樣,並不是說它本身好壞,而更大程度上取決於它周圍工具的好壞。

類型標註只能用於工具

引用自PEP0484:

考慮到該 PEP 出現時 Python 的狀態,這一點也是可以理解的,但現在應該更進一步了。我們已經成功地轉移到了 Python3,360 個 PyPi 上下載次數最多的包中有 359 個都兼容 Python3。類型提示深受社區歡迎。更進一步,Python 的類型提示應該帶來更多好處,如類型優化、自動運行時類型斷言等。我發現運行時類型斷言非常有用(特別是在函數庫中),但手工編寫非常麻煩。再加上類型提示,維護多個類型系統就變得特別麻煩。

就像其他提到的那樣,Python 4 很可能會把 JIT 當做最優先的功能。似乎這是個給類型標註進行性能優化的好地方。

變量可修改性

對於現在的 Python 我最大的不滿就是它沒有 const 或類似的東西。在我犯過的所有編碼錯誤中,90% 都是類型相關的錯誤(現在可以通過 mypy 捕獲大部分),或是以為自己創建了新變量,實際上卻錯誤地使用了同一個函數中定義過的變量。我知道有些包能實現這一點,但我希望 Python 自身能支持 const。

nbconvert

nbconvet 項目非常贊。它可以將 Jupyter notebook 轉換成其他各種格式,包括 PDF、Reveal.js 幻燈片,或者可執行腳本。在過去幾個月內我經常使用後兩者,它們真的改變了我的工作流程。我可以把一切都放在一個 notebook 中,最後再將其轉換成幻燈片在每週會議上把我的進度演示給同事。類似地我也可以在 notebook 中規劃一個想法,然後只需最小的代價將其轉換成腳本並用在產品中。

當然這只是想法。現實是,任何大小的 notebook 轉換成腳本都需要大量手工操作才能成功轉換,有時還不如手動複製粘貼。我聽說許多公司創建了 nbconvert 的 wrapper 使它更容易使用。我希望這些人能開源,這樣就能解決我的痛苦了。

關注小編,後期推送更多優秀的互聯網新聞~


分享到:


相關文章: