Python與C語言、Java、Nodejs、Golang進行性能測試比較
背景說明
在最近的項目開發中,遇到一個Python處理性能問題:
由于實時數據量較大(每秒有2100條日志,且每條日志平均大小在1kB左右),且受制于硬件資源限制,使用Python做實時數據處理,無法完成當前規模的數據集處理能力,數據越積越多,數據入庫延時越來越長!
- 第一版Python實現,其處理性能:840/s
- 優化版Python實現,其處理性能:1100/s
離2100/s,才剛滿足其一半的性能,這是不能接受的!
結論:在不使用Python多并發處理或增加硬件資源條件下,Python是不能完成當前系統性能要求的!
補充說明:
開3~4個Python數據處理進程能夠剛剛滿足系統性能要求,但是數據處理僅是系統一個模塊,系統還有其他功能模塊,對數據處理硬件資源要求,CPU不超過2個邏輯核心,內存最大不超過4GB;
關于硬件資源,由于項目規模原因,設備資源是有限的。
解決方案
本身知道Python運行速度并不快,跟其他編程語言(Java、Golang、C++等)性能差距較大。平時項目開發,使用Python都沒有任何問題。確實沒有重視Python性能方面的問題。
綜合考慮,就眼下項目實際情況,為解決數據處理性能問題,采用Golang方案,使用Go語言重寫數據處理模塊代碼邏輯,并最終解決了數據處理的性能問題!
最后說一下Go版數據處理性能:Go版數據處理性能是Python版的4到5倍,2100條日志處理只用了0.3s,僅使用單核CPU未并非處理,而且也只使用了單核 CPU 60%的處理性能!
Python性能測試
接下來進入主題,Python運行效率慢于其他編程語言,到底有多慢呢?那我們做一個Python的性能測試。
1.測試內容:
求0~N之間質數個數,具體求以下整數區間質數個數:
- 0~1w
- 0~4w
- 0~10w
- 0~20w
- 0~50w
- 0~100w
強調說明:本測試只是用來說明Python運行效率,語言其他方面的對比不屬于該測試范疇!
2.測試編程語言包括:
測試編程語言有:C語言、Java、node.js、Golang、Python等,通過不同語言測試結果,對比得出Python的運行效率結論。
語言版本說明:
- C語言:gcc version 8.1.0
- Java:1.8.0_121
- Nodejs:v10.15.3
- Golang:v1.12.7
- Python:v3.7.3
除了Python,選擇了C語言、Java、Nodejs、Golang作為性能對比測試語言,代表了當前主流的、使用廣泛的編程語言
3.測試環境說明:
- 在windows10最新版本;
- java代碼打包成可執行jar包,python代碼生產pyc文件,C代碼和Go代碼生產各自的可執行代碼;
- 求素數過程采用相同的方法(兩層for循環)
4.測試結果:
5.測試結論:
這5種編程語言,C語言運行效率最高,Python的運行效率最差。
C語言、Java、Node.js、Golang的運行效率比Python成幾何倍數高。
舉一個比較明顯測試結果,求0~20w之整數區間的質數個數,這個過程:
- C語言用時6s
- Java用時7s
- Nodejs用時8s
- Golang用時17s
- Python用時121s,是C語言的20倍,是Java的17倍,是Nodejs的15倍,是Go的7倍
開發效率和運行效率
對編程而言,開發效率和運行效率是始終是對立的:
- 追求開發效率高,其運行效率不快;
- 追求運行效率高,其開發效率不快;
既能保證開發效率,又能兼顧運行效率,那只能等到量子計算機普及了,扯遠了....
Python的開發效率
Python運行效率不高,但是其開發效率很高,這就是Python的優勢,簡單易學習,快速入門、實現短周期迭代開發,加之擁有豐富的、功能強大第三方庫,一旦你使用Python一段時間,你就會對它上癮,產生依賴,離不開它,再使用其他編程語言,各種不適應,因為Python給我們開發帶來了太多方便,這就是Python開發效率!
再舉個例子:
網上有這樣一個段子,同樣一個功能模塊,使用C語言實現需要寫幾百行代碼,使用Java實現需要寫100行代碼,使用Python實現就需要十幾行代碼,這個一點不夸張,確實是這樣,雖然Python運行效率不強,但是Python的開發效率快。
綜述
這個測試目的:是對Python這門語言有一個正確的認知,不僅要知道Python功能強大,優勢眾多,應用廣泛,但性能是Python不能規避的問題,只有了解了這些,我們才能正確運用Python!