是的,Python是慢,但我不在乎

幾年前我做運維時用到?Python,從此便成為 Python 的狂熱分子,工作上能用程序自動化實現(xiàn)的,我都盡可能積極的使用 Python,極大的提高了工作效率,不知道的以為我的工作是個閑職,導(dǎo)致我“丟”掉了運維崗位,也罷,重復(fù)的事情做多了也就乏味了。
慢慢的我知道了 GIL,也通過嘗試知道了在計算密集行任務(wù)方面,Python 的性能表現(xiàn)的確不如 Java,Golang 等靜態(tài)語言,有人也因此拒絕嘗試使用 Python,但是從我自身的經(jīng)歷來看,Python 并未讓我覺得慢,即使與其他語言相比,有點慢,但我并不在乎,原因如下:
一、速度不再那么重要。
過去,程序要花很長時間才能運行。CPU、內(nèi)存都很昂貴,程序的運行時間是一個非常重要的指標(biāo),電腦非常貴,運行它們的電費也很貴,而商業(yè)永恒不變的法制就是---優(yōu)化你最貴的那部分資源。從歷史來看,最昂貴的就是計算機(jī)的運行時間,這也是商業(yè)和科學(xué)研究的重點,算法,編譯優(yōu)化,都是為了讓程序更快的完成。
現(xiàn)在計算機(jī)不那么貴了,每個人都有了自己的電腦,不少人都有了自己的個人網(wǎng)站(服務(wù)器),硬件的性能也像摩爾定律那樣提升了很多,計算機(jī)的運行時間不在昂貴,而昂貴的是你的時間,本質(zhì)上講,老板雇傭你,就是購買的你的可支配時間。毫無疑問,同樣的功能,Python 是最節(jié)省你的時間的。
你也許會說,我的公司在乎速度,我創(chuàng)建了一個 web 應(yīng)用程序,需要在毫秒內(nèi)響應(yīng),或者說客戶會取消下單因為我們的應(yīng)用太慢了。我并不否認(rèn)速度不再重要,我想說的是速度并不是你最昂貴的資源,最昂貴的是你的時間,或者你公司搶占市場的先機(jī),也就是說你的編程速度是最昂貴的資源。
二、微服務(wù)的流行。
像亞馬遜、谷歌、奈飛等公司都知道快速行動的重要性,他們創(chuàng)建的業(yè)務(wù)系統(tǒng)可以快速部署和創(chuàng)新,微服務(wù)是其解決問題的方法,本文不討論是否該使用微服務(wù),但至少亞馬遜、谷歌、奈飛覺得應(yīng)該使用微服務(wù)。而微服務(wù)本來就慢,本來一個調(diào)用一個函數(shù)搞定,現(xiàn)在搞調(diào)用一個網(wǎng)絡(luò)接口。一個函數(shù)也就若干個?CPU?周期,而一個網(wǎng)絡(luò)接口卻是 TCP 的三次握手和四次揮手,如果假設(shè)一個 CPU 周期是 1 秒的話,那么從加尼福利亞到紐約的網(wǎng)絡(luò)訪問時常則是 4 年。微服務(wù)最大的缺點就是慢,最大的優(yōu)點就是可以快速出產(chǎn)品,快速上市。微服務(wù)的流行正說明,產(chǎn)品迭代開發(fā)速度比程序的運行速度更重要。
三、CPU 已不再是瓶頸。
如果你編寫 WEB 應(yīng)用,那么 CPU 的時間已經(jīng)不是瓶頸。還是剛才的例子,如果假設(shè)一個?CPU?周期是 1 秒的話,那么從加尼福利亞到紐約的網(wǎng)絡(luò)訪問時常則是 4 年,比如說同一數(shù)據(jù)中心內(nèi)部的網(wǎng)絡(luò)通信大約 3 毫秒,這相當(dāng)于人類的 3 個月,假設(shè)你用其他較快的編程語言 X 響應(yīng)一次請求需要 100000 個?CPU?周期,這相當(dāng)于人類的 1 天,也就是說總的響應(yīng)時間是 3 個月+ 1 天?,F(xiàn)在,就算 Python 比 X 慢 5 倍,也就是說總的響應(yīng)時間是?3 個月+ 5?天,你覺得區(qū)別大嗎?假如需要 3 個月后才能收到快遞,那么再多等個四天,基本上沒有多大關(guān)系。
這就意味著,即使 Python 有點慢也沒關(guān)系,也就是說語言的速度( CPU 時間)幾乎不是問題,Google 對此進(jìn)行了研究并發(fā)表了論文[https://static.googleusercontent.com/media/research.google.com/en//archive/sawzall-sciprog.pdf],大致意思如下:在高吞吐量環(huán)境下使用解釋型語言看起來很矛盾,但我們發(fā)現(xiàn) CPU 時間極少是限制因素,編程語言的可表達(dá)性意味著大多數(shù)程序都很小,大部分時間都是花在 I/O 操作和本地運行時代碼上,此外解釋型語言在允許我們將計算結(jié)果分布到許多機(jī)器上很有幫助。
四、CPU 時間就是瓶頸怎么辦?
你可能會說,我們遇到的問題就是 CPU 是瓶頸,導(dǎo)致 WEB 應(yīng)用訪問很慢,或者說語言 X ?就是比語言 Y 快,沒錯,有時確實如此。不過,WEB 服務(wù)器的妙處在于你幾乎可以無限制的進(jìn)行負(fù)載均衡,最簡單粗暴的方法,就是升級 CPU 或硬件,與你的時間相比,這些硬件非常便宜,如果一年節(jié)省你幾個星期的時間,這足以支付增加的硬件成本。
此外 Python 還可以調(diào)用 C 語言或 Java 的函數(shù),如果你覺得某一塊慢,可以使用其他語言改寫,再用 Python 調(diào)用,此外還可以了解下 Cython,可以把 Python 代碼編譯為 C 代碼來提升速度。
五、Python 更快嗎?
前面一直在說,最重要的是開發(fā)時間的長短,那么 Python 更快嗎?我可以明確的告訴你,Python 的生產(chǎn)率更高,它可以幫助你更專注于真正要編寫的代碼,而不會陷入細(xì)小的雜草中(你不用考慮用 vector 好還是 array 好),下面是一組數(shù)據(jù)來自一項研究論文:

不同語言編寫一個字符串處理程序所花費的時間
可以看出 Python 的生產(chǎn)力是 Java 的 2 倍以上??梢哉f Python 比其他許多語言的生產(chǎn)力更高,主要是由于 Python 的內(nèi)省和大量的第三方庫。
六、如果運行時間確實有影響呢?
有些情況下,運行時的性能確實很重要,那就需要優(yōu)化,但不要過早優(yōu)化,在不了解瓶頸的情況下進(jìn)行優(yōu)化,成為過早優(yōu)化。過早優(yōu)化會浪費你寶貴的時間,你應(yīng)該找到瓶頸(最昂貴的資源),然后進(jìn)行針對的優(yōu)化。
小結(jié):
1、針對最昂貴的資源進(jìn)行優(yōu)化,而不是計算機(jī)。
2、選擇可以幫助快速開發(fā)的語言或框架
3、當(dāng)你遇到性能問題時要找到瓶頸,很可能不是 CPU 或 Python 本身。
4、如果 Python 是瓶頸(已經(jīng)優(yōu)化了算法),請將關(guān)鍵代碼轉(zhuǎn)至 Cython 或 C 語言。
享受 Python 快速完成工作的過程吧!
關(guān)注我即刻了解更多數(shù)據(jù)分析知識
更多數(shù)據(jù)分析內(nèi)容
掃描碼即可了解
