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


















 
 
 





 
 
 
 